← 블로그 목록
작성일: 2026-06-04 logrotate로그 관리Linux

로그 로테이션 완벽 가이드: logrotate 설정과 문제 해결

웹 서버는 매일 수백만 줄의 로그를 생성하며, 관리하지 않으면 디스크가 꽉 차 서비스가 중단될 수 있습니다. logrotate를 이용해 로그를 자동으로 압축, 보관, 삭제하는 방법을 알아봅니다.


logrotate란?

Linux 표준 로그 관리 도구로, 로그 파일을:

  • 일정 주기로 로테이션 (새 파일로 교체)
  • 오래된 로그 압축
  • 일정 기간 후 삭제

logrotate 설정 파일 구조


Nginx logrotate 설정 예시

/etc/logrotate.d/nginx:

`` /var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 cat /var/run/nginx.pid endscript } `

옵션 설명


postrotate 스크립트

Nginx 재로드

` postrotate [ -f /var/run/nginx.pid ] && kill -USR1 cat /var/run/nginx.pid endscript `

kill -USR1은 Nginx에게 로그 파일을 다시 열라는 신호입니다.

Apache 재로드

` postrotate /etc/init.d/apache2 reload > /dev/null endscript `


로테이션 실행 시점

logrotate는 cron으로 자동 실행됩니다.

/etc/cron.daily/logrotate:

`bash #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf `

매일 새벽 6:25에 실행 (Ubuntu 기준)


수동 로테이션 테스트

Dry-run (실제 실행 안 함)

`bash sudo logrotate -d /etc/logrotate.d/nginx `

강제 실행

`bash sudo logrotate -f /etc/logrotate.d/nginx `

상태 확인

`bash cat /var/lib/logrotate/status `

출력:

` "/var/log/nginx/access.log" 2024-10-10-14:0:0 "/var/log/nginx/error.log" 2024-10-10-14:0:0 `

마지막 로테이션 시각이 기록됩니다.


로그 파일 압축 형식

경로역할
------------
/etc/logrotate.conf전역 설정
/etc/logrotate.d/개별 서비스 설정
옵션의미
------------
daily매일 로테이션 (weekly, monthly도 가능)
missingok로그 파일이 없어도 에러 없이 진행
rotate 1414개의 백업 유지 (14일치)
compress오래된 로그 gzip 압축
delaycompress최신 백업은 압축 안 함 (1세대 이전부터 압축)
notifempty빈 파일은 로테이션 안 함
create 0640 www-data adm새 로그 파일 권한/소유자
sharedscriptspostrotate 스크립트를 한 번만 실행
postrotate ... endscript로테이션 후 실행할 명령
포맷확장자옵션
--------------------
gzip (기본).gzcompress
bzip2.bz2compresscmd /bin/bzip2
xz.xzcompresscmd /usr/bin/xz
압축 안 함-nocompress

용량 기반 로테이션

날짜 대신 파일 크기로:

` /var/log/nginx/*.log { size 100M rotate 5 compress ... } `

100MB 초과 시 로테이션


로그 보관 기간 설정

30일치 보관

` 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 } `


문제 해결

1. 로그 로테이션이 안 됨

상태 파일 확인:

`bash cat /var/lib/logrotate/status | grep nginx `

마지막 실행 시각이 오래됐으면 수동 실행:

`bash sudo logrotate -f /etc/logrotate.d/nginx `

2. 디스크 용량 부족

`bash df -h /var/log `

100% 찬 상태면 임시 로그 삭제:

`bash sudo find /var/log -name "*.gz" -mtime +30 -delete `

3. Nginx가 로그를 안 씀

로테이션 후 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 스크립트로 웹 서버에게 새 로그 파일을 열라는 신호를 보내야 로테이션이 제대로 작동합니다.