본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
로그 파일을 주기적으로 압축하고 이름을 바꾸어 관리한다.
  • 리눅스에서만 지원
  • 경로 : /usr/sbin/logrotate
  • 설정 파일 경로
    • 베이스 설정 파일: /etc/logrotate.conf
    • 로그별 설정 파일 디렉터리: /etc/logrotate.d/

로그별 설정 파일 디렉터리(/etc/logrotate.d/)에 설정 파일을 넣어 두기만 하면 알아서 동작한다. 내부적으로 cron 기반이므로 재기동 등의 특별한 절차가 필요하지 않다.

파일·디렉터리 역할
/etc/logrotate.conf 시스템 전체에 적용하는 기본 설정
/etc/logrotate.d/ 응용 프로그램(httpd, syslog 등)별 설정 파일을 두는 디렉터리
/etc/cron.daily/logrotate cron 이 하루에 한 번 실행하는 스크립트. 이것이 logrotate 를 부른다
/var/lib/logrotate/logrotate.status(예전 배포판은 /var/lib/logrotate.status) 로그마다 마지막으로 순환한 날짜를 적어 두는 상태 파일
  • systemd 를 쓰는 최근 배포판은 cron.daily 대신 logrotate.timer 로 매일 실행하기도 한다
  • /etc/logrotate/logrotate.conf, /opt/logrotate.d 같은 경로는 쓰지 않는다

아래와 같은 명령어도 있으나, 기본적으론 설정 파일을 만들어 넣는 식으로 이용하는 것만으로 충분하다. 베이스 설정 파일에 기본적인 설정(ex. datetext)들이 있으므로 새로운 설정 파일엔 경로 등 일부 간단한 설정만 넣어줘도 된다.

설정 파일을 만드는 것이 핵심이므로 아래 문법보단 리눅스 logrotate.conf 문서를 참고하자.

  • 기존 로그 파일 이름 변경
    • 예: access_log → access_log.1 또는 access_log-2025-06-02
  • 필요 시 압축 처리
    • 예: access_log.1 → access_log.1.gz
  • 새로운 빈 로그 파일 생성
    • create 옵션이 있으면 access_log 파일을 다시 생성하고 권한 부여
  • 서비스에 로그 파일 교체를 알림
    • 보통 postrotate에서 systemctl reload 같은 명령으로 알림
logrotate [옵션] <설정파일>
  • -d : 디버거 모드
  • -f, --force : 새로운 목록이 추가되었거나 오래된 로그 파일을 수동으로 삭제할 경우 강제로 실행한다.
  • -s, --state [statefile] : 지정한 정책 파일(statefile)으로 logrotate를 실행한다.
  • --usage : 사용법을 출력한다.

설정파일 옵션

편집 원본 편집
  • yearly, monthly, weekly, daily 주기 옵션으로 로테이트를 실행할때 로그를 어떤 주기로 로테이트를 할지 선택
  • rotate [숫자] 로그파일의 개수가 숫자이상이면 가장 오래된 로그파일을 삭제합니다.
  • create [권한] [유저] [그룹] 로테이트 될때 생성되는 로그파일 권한 및 소유자 지정
  • notifempty 로그 내용이 없으면 로테이트를 실행하지 않음 이와 반대로
  • ifempty는 로그 내용이 없어도 로테이트를 진행
  • compress 로테이트로 생성되는 로그파일 gzip으로 압축생성
  • nocompress 로테이트로 생성되는 로그파일을 압축하지 않고 생성
  • missingok 로그파일을 발견하지 못해도 에러처리 하지 않음
  • dateext 로테이트 파일의 이름에 날짜가 들어가도록 생성
  • size [숫자 K,M,G] 로그 파일이 크기가 설정보다 커지면 로테이트 실행
  • maxage [숫자] 파일이 지정일 이상되면 삭제
  • postrotate 실행후 스크립트 파일 실행
  • endscript 스크립트를 실행하는 옵션 다음에 들어가야하는 옵션

httpd 기본 설정 내용

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

아파치는 그 동작 구성 상 한번 구동이 되면 로그 파일 핸들을, 첫 구동 시 만든 것으로 계속 사용한다. 그래서 기존에 쓰고 있던 로그 파일을 없애고 새롭게 로그파일을 생성한 경우 reload를 해줘야 정상적으로 새로운 파일에 로그를 기록한다.[1]

  1. ↑ 위 동작 과정을 보면 알 수 있다. 만약 기존 로그 파일을 복제한 후, 내용을 비우는 방식이라면 reload가 필요 없겠지만 그렇게 하면 복제를 위한 I/O가 크기 때문에 mv로 파일명만 바꾸고 새로운 빈 파일을 만드는 식으로 동작하기 때문이다.