logrotate 설정 빌더 완벽 가이드
logrotate는 시스템 로그를 자동으로 회전·압축·삭제하는 표준 유틸리티로, /etc/cron.daily/logrotate 가 매일 한 번 실행되어 /etc/logrotate.conf 와 /etc/logrotate.d/ 디렉터리의 모든 정의를 평가합니다. 로그가 무한정 커져 디스크가 가득 차는 사고를 막고, 압축으로 저장 공간을 절약하며, 보관 기간을 관리해 컴플라이언스를 만족시키는 가장 일반적이고 검증된 방법입니다.
주요 디렉티브
- daily / weekly / monthly / yearly: 로테이션 빈도. 트래픽이 많은 웹서버 액세스 로그는 daily, 일반 애플리케이션 로그는 weekly가 무난합니다.
- rotate N: 보관할 이전 파일 개수. daily + rotate 7 이면 약 1주일치를, weekly + rotate 4 이면 한 달치를 보관합니다.
- compress / delaycompress: gzip 압축. delaycompress는 바로 직전 파일은 압축하지 않아 일부 데몬이 fd를 유지할 시간을 줍니다.
- missingok: 로그 파일이 없어도 에러 없이 통과. nginx 처럼 가상호스트에 따라 파일이 없을 수 있는 경우 필수입니다.
- notifempty: 0바이트 로그는 회전하지 않음. 불필요한 빈 파일을 만들지 않습니다.
- create mode owner group: 회전 후 새 빈 로그 파일을 지정 권한으로 생성. 예:
create 0640 www-data adm. - dateext / dateformat: 회전 파일명에 .1 대신 -YYYYMMDD 를 붙임. 파일 정렬과 검색이 직관적입니다.
- postrotate / endscript: 회전 직후 실행할 셸 스크립트. nginx는
/usr/sbin/nginx -s reopen, systemd 서비스는systemctl kill -s USR1 [unit]패턴이 표준입니다. - copytruncate: 새 파일을 만드는 대신 원본을 잘라냄. 데몬이 SIGHUP/USR1을 처리하지 못할 때 마지막 수단으로 사용합니다(짧은 손실 가능).
- size N: 시간 대신 파일 크기 기준으로 회전(예: size 100M).
- sharedscripts: 여러 파일 패턴이 매칭되어도 postrotate를 한 번만 실행. 데몬 reload 비용을 줄여줍니다.
운영 팁
설정 작성 후 logrotate -d /etc/logrotate.d/my-app으로 dry-run 디버그를 돌려 어떤 파일이 회전 대상이 되는지, postrotate가 어떻게 평가되는지 확인하세요. 실제 강제 실행은 logrotate -f /etc/logrotate.d/my-app 입니다. nginx, php-fpm, gunicorn 같은 데몬은 reopen 또는 USR1 시그널로 fd를 다시 여는 패턴이 가장 안전하고 손실이 없습니다. 로그 디렉터리의 소유자/그룹을 데몬과 일치시켜야 회전 후 새 파일에 데몬이 쓰기 권한을 갖습니다.
자주 묻는 질문 (FAQ)
Q. cron이 실행되었는데도 회전이 안 됩니다.
A. notifempty(빈 파일은 회전 안 함), 빈도 조건(daily는 마지막 회전 후 1일 경과 필요), missingok 미설정 + 파일 부재 등 흔한 원인입니다. logrotate -d로 정확한 사유를 확인하세요.
Q. copytruncate와 create의 차이는?
A. create는 새 inode를 만들고 데몬이 reopen/HUP 처리해야 하며 손실이 없습니다. copytruncate는 같은 inode를 truncate 하므로 데몬 변경 없이 동작하지만 복사~truncate 사이에 쓰여진 짧은 구간이 유실될 수 있습니다.
Q. postrotate가 매번 실행되어 무겁습니다.
A. 여러 와일드카드 경로를 한 블록에 묶고 sharedscripts 를 추가하면 블록당 1회만 실행됩니다.