웹 서버는 매일 수백만 줄의 로그를 생성하며, 관리하지 않으면 디스크가 꽉 차 서비스가 중단될 수 있습니다. 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 } `
상태 파일 확인:
`bash cat /var/lib/logrotate/status | grep nginx `
마지막 실행 시각이 오래됐으면 수동 실행:
`bash sudo logrotate -f /etc/logrotate.d/nginx `
`bash df -h /var/log `
100% 찬 상태면 임시 로그 삭제:
`bash sudo find /var/log -name "*.gz" -mtime +30 -delete `
로테이션 후 Nginx가 여전히 이전 inode에 쓰고 있을 수 있음:
`bash sudo lsof | grep deleted | grep nginx `
해결:
`bash 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 스크립트로 웹 서버에게 새 로그 파일을 열라는 신호를 보내야 로테이션이 제대로 작동합니다.