← 블로그 목록
작성일: 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:

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

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


수동 로테이션 테스트

Dry-run (실제 실행 안 함)

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

강제 실행

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

상태 확인

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. 로그 로테이션이 안 됨

상태 파일 확인:

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

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

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

2. 디스크 용량 부족

df -h /var/log

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

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

3. Nginx가 로그를 안 씀

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