logrotate는 Linux 시스템에서 로그 파일을 자동으로 관리하고 압축, 백업, 삭제, 로테이션 등을 수행하는 유틸리티입니다. 로그 파일은 시스템 리소스를 차지하고 디스크 공간을 낭비할 수 있으므 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
}
rotate 개수가 로그 유지에 미치는 영향rotate 1 설정일 경우rotate 1이면 가장 최근의 백업 1개만 유지하고 그보다 이전의 백업은 삭제합니다.
예를 들어, nginx.log 파일이 2월 17일에 회전되었다면?:
2월 18일에 다시 logrotate가 실행되면?
nginx.log # 새로 생성된 활성 로그 파일
nginx.log-20240218 # 오늘 회전된 로그 파일 (이전 로그)
이때 nginx.log-20240217 파일은 삭제됩니다. 즉, 항상 활성 로그 1개 + 백업 1개(어제 로그)만 유지됩니다..
rotate 5 설정일 경우rotate 5는 최대 5개의 백업 파일을 유지합니다. 따라서 하루마다 로그가 회전될 때, 가장 오래된 백업 파일이 삭제됩니다.
예를 들어, 2월 17일부터 로그 파일이 생성되었다면?:
nginx.log # 현재 활성 로그 파일
nginx.log-20240221 # 21일 백업
nginx.log-20240220 # 20일 백업
nginx.log-20240219 # 19일 백업
nginx.log-20240218 # 18일 백업
nginx.log-20240217 # 17일 백업
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개의 로그 백업만 유지된다.
서버가 2월 17일부터 28일까지 실행되었다고 가정하고 rotate 5 설정이 적용된 경우를 살펴보겠습니다.
rotate=5, daily 설정을 적용한 경우 (28일까지 실행)nginx.log-20240218 삭제됨 (rotate 5개 유지 정책에 의해)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일 이전 로그)는 자동 삭제됩니다.
logrotate를 매일 자동으로 실행하려면 crontab을 설정하면 됩니다.
아래와 같이 crontab -e 명령어를 실행한 후, 다음 내용을 추가하면 됩니다.
0 0 * * * /home/nginx/rotate.sh
이 설정은 매일 00:00(자정)에 /home/nginx/rotate.sh 스크립트를 실행하여 logrotate를 수행하도록 합니다. 해당 스크립트는 내부적으로 logrotate -f 명령어를 실행할 수 있도록 작성하면 됩니다.
# 크론탭 작업 내용 확인
crontab -l
# 크론탭 편집
crontab -e
# 크론탭 주기
분/시/일/월/요일 {실행 명령}
# 크론탭 시작
service cron start
# 크론탭 중지
service cron stop
# 작동확인
service cron status
# 주의사항
# 설정 변경 후 항상 cron 서비스 재시작
service cron restart 또는 service crond restart
logrotate는 시스템 로그를 효과적으로 관리하는 필수적인 도구지만, 설정을 잘못 이해하면 로그가 예상보다 빨리 삭제되거나 유지 기간이 예상보다 짧아질 수 있습니다.
운영 환경에서 원하는 로그 보존 기간을 정확히 유지하려면 rotate 개수와 daily/weekly 설정을 신중하게 조정하는 것이 중요합니다.