Nginx log 관리 (logrotate)

문정현·2025년 2월 19일
post-thumbnail

logrotate는 Linux 시스템에서 로그 파일을 자동으로 관리하고 압축, 백업, 삭제, 로테이션 등을 수행하는 유틸리티입니다. 로그 파일은 시스템 리소스를 차지하고 디스크 공간을 낭비할 수 있으므 logrotate를 사용하여 로그 파일을 효과적으로 관리할 수 있습니다.

1. Logrotate 기본 설정

logrotate 설정 파일은 일반적으로 /etc/logrotate.d/ 디렉터리 안에 위치하며, 각 서비스별로 관리할 수 있습니다.

예를 들어, Nginx 로그를 관리하는 logrotate 설정을 다음과 같이 작성할 수 있습니다.

/home/nginx/logs/*/*.log {
        daily                    # 매일 로그 회전
        rotate 5                 # 최근 5개의 백업 파일만 유지
        dateext                  # 백업 파일에 날짜 추가 (예: nginx.log-20240217)
        missingok                # 로그 파일이 없어도 오류 발생 X
        compress                 # 백업 파일 압축
        delaycompress            # 가장 최근 백업 파일은 압축하지 않음
        notifempty               # 로그 파일이 비어 있으면 회전하지 않음
        create 0640 nginx nginx  # 새 로그 파일 권한 설정
        sharedscripts            # 로그 파일별로 개별 실행하지 않고 한 번만 실행
        postrotate               # rotate를 실행한 이후 명령어 수행
          kill -USR1 `cat /home/nginx/pid/nginx_oper/nginx_oper.pid 2>/dev/null` 2>/dev/null || true
        endscript
}

2. rotate 개수가 로그 유지에 미치는 영향

case1 : rotate 1 설정일 경우

rotate 1이면 가장 최근의 백업 1개만 유지하고 그보다 이전의 백업은 삭제합니다.

예를 들어, nginx.log 파일이 2월 17일에 회전되었다면?:

2월 18일에 다시 logrotate가 실행되면?

nginx.log            # 새로 생성된 활성 로그 파일
nginx.log-20240218   # 오늘 회전된 로그 파일 (이전 로그)

이때 nginx.log-20240217 파일은 삭제됩니다. 즉, 항상 활성 로그 1개 + 백업 1개(어제 로그)만 유지됩니다..


case2 : rotate 5 설정일 경우

rotate 5최대 5개의 백업 파일을 유지합니다. 따라서 하루마다 로그가 회전될 때, 가장 오래된 백업 파일이 삭제됩니다.

예를 들어, 2월 17일부터 로그 파일이 생성되었다면?:

  • 2월 21일 (5일차 회전 후)
nginx.log            # 현재 활성 로그 파일
nginx.log-20240221   # 21일 백업
nginx.log-20240220   # 20일 백업
nginx.log-20240219   # 19일 백업
nginx.log-20240218   # 18일 백업
nginx.log-20240217   # 17일 백업
  • 2월 22일 (6일차 회전 후)
nginx.log            # 현재 활성 로그 파일
nginx.log-20240222   # 22일 백업 (새로 추가)
nginx.log-20240221   # 21일 백업
nginx.log-20240220   # 20일 백업
nginx.log-20240219   # 19일 백업
nginx.log-20240218   # 18일 백업 ❌ (삭제됨)

즉, 6일차부터 가장 오래된 백업(18일 로그)이 삭제되면서, 항상 최근 5개의 로그 백업만 유지된다.


3. 실제 운영 시나리오 정리

서버가 2월 17일부터 28일까지 실행되었다고 가정하고 rotate 5 설정이 적용된 경우를 살펴보겠습니다.

rotate=5, daily 설정을 적용한 경우 (28일까지 실행)

  • 2월 17일: 최초 로그 파일 생성
  • 2월 18~23일: 매일 로그 회전, 백업 파일 증가 (최대 5개까지 유지)
  • 2월 24일: nginx.log-20240218 삭제됨 (rotate 5개 유지 정책에 의해)
  • 2월 28일: 최종적으로 남아 있는 백업 파일은 24일부터 28일까지의 5개 + 활성 로그 1개입니다.
nginx.log            # 현재 활성 로그 파일 (28일 로그)
nginx.log-20240228   # 28일 백업
nginx.log-20240227   # 27일 백업
nginx.log-20240226   # 26일 백업
nginx.log-20240225   # 25일 백업
nginx.log-20240224   # 24일 백업

이전 로그(23일 이전 로그)는 자동 삭제됩니다.


4. Crontab을 이용한 자동 실행

logrotate를 매일 자동으로 실행하려면 crontab을 설정하면 됩니다.

아래와 같이 crontab -e 명령어를 실행한 후, 다음 내용을 추가하면 됩니다.

0 0 * * * /home/nginx/rotate.sh

이 설정은 매일 00:00(자정)에 /home/nginx/rotate.sh 스크립트를 실행하여 logrotate를 수행하도록 합니다. 해당 스크립트는 내부적으로 logrotate -f 명령어를 실행할 수 있도록 작성하면 됩니다.

4.1 크론탭 명령어 정리

# 크론탭 작업 내용 확인
crontab -l
# 크론탭 편집
crontab -e
# 크론탭 주기////요일 {실행 명령}
# 크론탭 시작
service cron start
# 크론탭 중지
service cron stop
# 작동확인
service cron status
# 주의사항
# 설정 변경 후 항상 cron 서비스 재시작
service cron restart 또는 service crond restart

5. 마무리

logrotate는 시스템 로그를 효과적으로 관리하는 필수적인 도구지만, 설정을 잘못 이해하면 로그가 예상보다 빨리 삭제되거나 유지 기간이 예상보다 짧아질 수 있습니다.

운영 환경에서 원하는 로그 보존 기간을 정확히 유지하려면 rotate 개수와 daily/weekly 설정을 신중하게 조정하는 것이 중요합니다.

profile
기록 == 성장

0개의 댓글