레이블이 cron인 게시물을 표시합니다. 모든 게시물 표시
레이블이 cron인 게시물을 표시합니다. 모든 게시물 표시

nginx rotate log

# 방법1
https://www.cambus.net/log-rotation-directly-within-nginx-configuration-file/
# 하지만 error.log 에는 적용이 안된다.
# nginx.conf 설정
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
    set $hour $4;
    set $minutes $5;
}
access_log /var/log/nginx/$year-$month-$day-$hour-$minutes-access.log;

# 방법2
https://www.nginx.com/resources/wiki/start/topics/examples/logrotation/
http://nginx.org/en/docs/control.html#logs
# USR1 시널을 사용해 로그 파일 모두 rotate 가능하다.
# 쉘 스크립트를 작성해서 크론잡으로 등록한다.
# 1시간 전의 시간으로 파일명 변경
mv access.log `date -d '1 hour ago' '+%Y-%m-%d-%H-%M'`-access.log

# nignx 마스터 프로세스에 USR1(file reopen) 시그널 보내기
kill -USR1 `cat master.nginx.pid`
sleep 1

# 로그레벨 참고 : debug, info, notice, warn, error, crit, alert, emerg
error_log logs/error.log 로그레벨;

# 방법3
# logrotate 사용(nginx 외 일반적인 로그들에 모두 사용 가능)
https://github.com/logrotate/logrotate
# centos logrotate 설치
yum install logrotate

# ubuntu(debian) logrotate 설치
apt-get install logrotate

# logrotate 는 cron 으로 실행 주기를 관리한다.
# logrotate 기본 설정
vi /etc/logrotate.conf

# 설정 파일들 위치 포함
include /etc/logrotate.d

# nginx logrotate 설정
vi /etc/logrotate.d/ysoftman_nginx

# /var/log/nginx/*.log 파일은
/var/log/nginx/ {
    # 매일 로그를 바꾼다. 매주는 weekly, 매월은 monthly
    daily

    # 4일 분량의 로그를 남긴다. weekly 라면 4일, monthly 라면 4월
    rotate 4

    # 로그 파일이 비워있으면 로테이션 하지 않는다.
    notifempty

    # 로그파일이 유실되더라고 에러를 발생시키지 않는다.
    missingok

    # 로테이션후 빈파일을 생성
    create

    # 로테이션된 파일의 suffix 로 날짜지정 (xxx.log-YYMMDD)
    dateext

    # 압축하기
    compress

    # 모든 로그파일에 대해서 postrotate 스크립트가 한번만 실행되도록(공유) 한다.
    sharedscripts

    # postrotate ~ endscript 사이에는 로테이션 후 실행될 쉘 스크립트 명시
    postrotate
       kill -USR1 `cat /home/ysoftman/nginx/master.nginx.pid`
    endscript 
}

# 테스트 해보기
# logrotate 는 로테이션 된 내역을 다음 파일로 기록한다.
# 여기에 기록된 파일들은 로테이션 되지 않는다.
# 테스트를 위해 logrotate 필요하다면 파일명 뒤에 있는 rotate 시간을 과거로 수정한다.
# 이파일은 삭제하더라도 logrotate 실행하면 다시 이전 상태로 복구되니 시간을 수정해야 한다.
cat /var/lib/logrotate/logrotate.status

# debug(실제 rotate 는 되지 않음)모드로 테스트
# 실행 작업 순서가 출력지만 실제 rotate 할때는 에러가 발생할 수 있다.
logrotate -d /etc/logrotate.d/ysoftman_nginx

# 실제 rotate 해보기
# compress 등 rotate 후의 작업이 실행이 되지 않았다면
# -v 로 postrotate 등의 스크립트 에러 메시지를 체크해 보자.
logrotate -v /etc/logrotate.d/ysoftman_nginx

Linux Cron 과 Crontab 을 이용한 작업스케쥴

# cron 은 일정시간마다 시스템이 자동으로 실행시키는 데몬이다.
# crontab 은 cron 등록,삭제등의 작업을 한다.
# cron 데몬의 시작/종료/상태/재시작... 등
/etc/rc.d/init.d/crond [start/stop/status/restart ...]

# cron 데몬에 등록된 목록 보기
crontab -l

# crontab 편집기는 $EDITOR 와 $VISUAL 환경변수에 설정된 에디터를 사용하게 된다.
# 기본 편집기 vim 으로 변경하기(.bashrc 등에 추가)
export EDITOR=vim
export VISUAL=vim

# cron 에 등록된 내용 편집
crontab -e

# 참고로 crontab 에서는 쉘 환경변수를 상속하지 않기때문에 별도록 지정해야 한다.
SHELL=/bin/bash
JAVA_HOME=/usr/java/jdk1.6.0_10
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$JAVA_HOME/bin:

# 분(0~59) 시(0~23) 일(1~31) 월(1~12) 요일(1:월요일~7:일요일) 실행할명령어
# 매월 10일 0시 마다 test를 실행하려면
0 0 10 * * /home/ysoftman/test

# 2시간마다 test를 실행하려면
0 */2 * * * /home/ysoftman/test

# 현재 등록된 cron job 모두 삭제
crontab -r

# 'ysoftman' 이 포함된 job 만 삭제
# alias grep='grep -n' 로 라인번호가 출력되면 crontab 등록이 안된다.
crontab -l | /usr/bin/grep -v 'ysoftman' | crontab

# 또는 grep alias 무시
crontab -l | \grep -v 'ysoftman' | crontab

# cron 로그
vi /etc/log/cron (로그 설정은 /etc/syslog.conf)

# cron 작업은 다음 위치에 저장된다.
/etc/cron.daily
/etc/cron.deny
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly

# macOS 터미널에서 crontab -e 설정시 다음과 같은 에러가 발생한다면
"operation not permmited"

# 다음 화면과 같이  system preferences -> security & privacy -> privacy 에서 iterm2 를 추가해준다.


# 그리고 macOS 에는 sleep 모드에선 cron 이 작동하지 않는다.
# system preferences -> energy saver 에서 디스플레이가 꺼져도 잠자기 않도록 해야 한다.