웹 서버는 매일 수백만 줄의 로그를 생성하며, 관리하지 않으면 디스크가 꽉 차 서비스가 중단될 수 있습니다. logrotate를 이용해 로그를 자동으로 압축, 보관, 삭제하는 방법을 알아봅니다.
Linux 표준 로그 관리 도구로, 로그 파일을:
| 경로 | 역할 | |
|---|---|---|
/etc/logrotate.conf | 전역 설정 | |
/etc/logrotate.d/ | 개별 서비스 설정 | |
| 옵션 | 의미 | |
daily | 매일 로테이션 (weekly, monthly도 가능) | |
missingok | 로그 파일이 없어도 에러 없이 진행 | |
rotate 14 | 14개의 백업 유지 (14일치) | |
compress | 오래된 로그 gzip 압축 | |
delaycompress | 최신 백업은 압축 안 함 (1세대 이전부터 압축) | |
notifempty | 빈 파일은 로테이션 안 함 | |
create 0640 www-data adm | 새 로그 파일 권한/소유자 | |
sharedscripts | postrotate 스크립트를 한 번만 실행 | |
postrotate ... endscript | 로테이션 후 실행할 명령 | |
| 포맷 | 확장자 | 옵션 |
| gzip (기본) | .gz | compress |
| bzip2 | .bz2 | compresscmd /bin/bzip2 |
| xz | .xz | compresscmd /usr/bin/xz |
| 압축 안 함 | - | nocompress |
날짜 대신 파일 크기로:
/var/log/nginx/*.log {
size 100M
rotate 5
compress
...
}
100MB 초과 시 로테이션
rotate 30
maxage 7
7일 이상된 백업 삭제
기본:
access.log
access.log.1
access.log.2.gz
access.log.3.gz
날짜 형식:
dateext
dateformat -%Y%m%d
결과:
access.log
access.log-20241010
access.log-20241009.gz
/var/log/nginx/access.log /var/log/nginx/error.log {
daily
rotate 14
compress
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
상태 파일 확인:
cat /var/lib/logrotate/status | grep nginx
마지막 실행 시각이 오래됐으면 수동 실행:
sudo logrotate -f /etc/logrotate.d/nginx
df -h /var/log
100% 찬 상태면 임시 로그 삭제:
sudo find /var/log -name "*.gz" -mtime +30 -delete
로테이션 후 Nginx가 여전히 이전 inode에 쓰고 있을 수 있음:
sudo lsof | grep deleted | grep nginx
해결:
sudo systemctl reload nginx
로그를 S3로 자동 백업:
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
aws s3 cp /var/log/nginx/*.gz s3://my-bucket/nginx-logs/
endscript
logrotate는 daily/weekly 주기, rotate 수, compress 옵션으로 로그 생명주기를 관리합니다. postrotate 스크립트로 웹 서버에게 새 로그 파일을 열라는 신호를 보내야 로테이션이 제대로 작동합니다.