[DevOps] Nginx Logrotation 설정

안녕하세요? 정리하는 개발자 워니즈 입니다. 웹 서버를 운영하다보면, 로그 파일들이 무분별하게 쌓이는 문제가 있습니다. 이를 정리하기 위해서는 logrotation이라는 프로그램을 이용해야 하는데요. logrotation을 어떻게 설정하고 어떤식으로 활용하는지에 대해서 정리를 해보도록 하겠습니다.

Nginx에 관한 시리즈 포스팅은 아래에서 확인이 가능합니다.

1. Logrotation 이란?

간단하게 리눅스에서 사용할 수 있는 프로그램.

Logrotatefㅡㄹ 사용하면 특정 폴더에 쌓이는 로그를 날짜 별로 나누어서 관리를 할 수 있으며, 기준을 정하면 해당일 이전 로그는 삭제하여 시스템 용량을 낭비하지 않을 수 있습니다.

Logrotate 구조

  • /etc/logrotate.conf : 로그 로테이트의 기본 설정 파일

    기본 설정 : log는 주 단위로 백업 -> 4주동안 보관

    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    
    # keep 4 weeks worth of backlogs
    rotate 4
    
    # create new (empty) log files after rotating old ones
    create
    
    # use date as a suffix of the rotated file
    dateext
    
    # uncomment this if you want your log files compressed
    #compress
    
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d
    
    # no packages own wtmp and btmp -- we'll rotate them here
    /var/log/wtmp {
      monthly
      create 0664 root utmp
          minsize 1M
      rotate 1
    }
    
    /var/log/btmp {
      missingok
      monthly
      create 0600 root utmp
      rotate 1
    }
    
    # system-specific logs may be also be configured here.
    
  • /etc/logrotate.d/ : 로그 로테이트의 개별 설정 파일이 들어있는 폴더
    ## syslog 예시
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
      missingok
      sharedscripts
      postrotate
          /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
      endscript
    }
    
    ## custom 예시
    ## test.txt를 rotation할시에 data.json파일도 강제적으로 날짜별 copy를 수행
    /home1/test/apps/devops/logs/test.txt {
      daily
        missingok
      copytruncate
      dateext
      notifempty
      postrotate
          cp -p /home1/test/apps/devops/logs/data.json /home1/test/apps/devops/logs/data.json-`date +%Y%m%d.%H%M%S`
      endscript
    }
    
  • /etc/cron.daily/logrotate : 로그 로테이트 작업 내역 로그

2. Logrotation 설정 방법

필자는 nginx log에 대해서 rotation설정을 진행했습니다.

  • nginx logrotation 설정
/apps/nginx-1.20.1/logs/access_log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        create 640 root root
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

1️⃣ 로그 정리 대상 파일 : /apps/nginx-1.20.1/logs/access_log
2️⃣ daily : daily(매일), weekly(매주), monthly(매달), yearly(매년) 순환
3️⃣ missingok : 로그파일이 없을 경우에도 에러로 처리하지 않음
4️⃣ rotate 7 : rotate 파일 갯 수
5️⃣ compress : 순환된 로그파일 압축(gz)
6️⃣ delaycompress : 최근파일 외 전부 압축
7️⃣ notifempty : 로그파일이 제로인 경우 rotation하지 않음
8️⃣ sharedscripts : prerotate, postrotate 스크립트를 한번만 실행
9️⃣ postrotate : 로그파일 분할 후 실행할 script 지정 ( nginx 의 경우 SIGUSR1 을 받으면 로그 파일을 새로 읽으므로 새로 만들어진 로그 파일에 로그를 기록합니다. )
🔟 copytruncate : 대부분의 어플리케이션들은 SIGTERM을 받으면, 로그파일을 새로 만듭니다. copytruncate를 이용하면 원본파일을 지우지 않고, truncate(파일 크기를 0으로 만든다)한다.

3. Logrotation 설정 테스트

로그 로테이션 설정을 진행하고나서 설정 테스트를 하기 위해서는 아래와 같이 테스트를 진행합니다.

logrotate -d -f /etc/logrotate.d/nginx
  • -d, –debug : 디버그 모드, 실제 로그 파일을 변경하지는 않고 처리 과정만 표시합니다.

참고

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다