리눅스 logrotate
IT위키
더 많은 작업
- 로그 파일을 주기적으로 압축하고 이름을 바꾸어 관리한다.
- 리눅스에서만 지원
- 경로 : /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]
- ↑ 위 동작 과정을 보면 알 수 있다. 만약 기존 로그 파일을 복제한 후, 내용을 비우는 방식이라면 reload가 필요 없겠지만 그렇게 하면 복제를 위한 I/O가 크기 때문에 mv로 파일명만 바꾸고 새로운 빈 파일을 만드는 식으로 동작하기 때문이다.