로그는 중요하다
로그 파일은 시스템 관리자가 서버의 상태를 파악하고 문제를 해결하는 데 필수적인 정보를 제공한다. 웹 서버, 애플리케이션 서버, 데이터베이스 등 모든 서비스는 자신의 활동을 로그 파일에 기록한다. 이러한 로그 파일들은 시간이 지날수록 크기가 커지게 되는데, 방치하면 디스크 공간을 빠르게 소진시켜 시스템 장애를 일으킬 수 있다.
Logrotate란 무엇인가
Logrotate는 리눅스 시스템에서 로그 파일을 자동으로 관리하고 압축, 백업, 삭제, 로테이션 등을 수행하는 유틸리티다
로그 파일이 지나치게 커지는 것을 방지하고, 디스크 공간을 효율적으로 관리할 수 있게 도와준다
대부분의 리눅스 배포판에는 logrotate가 기본적으로 포함되어 있으며, 필요한 경우 패키지 관리자를 통해 쉽게 설치할 수 있다
Logrotate의 주요 기능
Logrotate는 다음과 같은 핵심 기능을 제공한다
- 로그 파일의 주기적인 순환(rotation)
- 로그 파일의 압축
- 오래된 로그 파일의 자동 삭제
- 파일 권한 및 소유자 관리
- 로그 백업 및 아카이빙
- 이메일 알림 기능
Logrotate 파일 구조와 동작 방식
파일 구조
Logrotate는 다음과 같은 파일 구조를 가진다
- 데몬 프로그램
/usr/sbin/logrotate
- 메인 설정 파일
/etc/logrotate.conf
- 개별 서비스 설정 디렉토리
/etc/logrotate.d/
- 상태 파일
/var/lib/logrotate.status
- Cron 설정
/etc/cron.daily/logrotate
동작 프로세스 시각화
[Cron 작업] → [logrotate 명령 실행] → [logrotate.conf 읽기] → [logrotate.d/* 파일 읽기] → [로그 파일 처리]
동작 방식
Logrotate는 기본적으로 Cron에 의해 주기적으로 실행된다
대부분의 리눅스 배포판에서는 /etc/cron.daily/logrotate
스크립트를 통해 매일 실행된다
실행 시 /etc/logrotate.conf
파일과 /etc/logrotate.d/
디렉토리 내 설정 파일들을 읽어 각 로그 파일에 대한 설정에 따라 로테이션 작업을 수행한다
기본 동작 순서는 다음과 같다
- crontab에 의해 정해진 시간에 logrotate가 실행됨
/etc/logrotate.conf
설정 파일 읽기/etc/logrotate.d/
디렉토리의 개별 설정 파일 읽기- 로그 파일 순환, 압축, 삭제 등의 작업 수행
- 작업 결과를
/var/lib/logrotate.status
파일에 기록
Logrotate 설정 방법
기본 설정 파일 - logrotate.conf
/etc/logrotate.conf
파일은 logrotate의 전체적인 기본 설정을 정의한다
기본 설정 예시는 다음과 같다
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
주요 설정 옵션
Logrotate의 주요 설정 옵션은 다음과 같다
- 주기 설정
daily
매일 로그 순환weekly
매주 로그 순환monthly
매월 로그 순환yearly
매년 로그 순환
- 파일 관리
rotate 숫자
보관할 로그 파일 개수 설정size 크기
특정 크기(k, M, G 단위로 지정)에 도달하면 로테이션 실행maxage 숫자
지정된 일수 이후 로그 파일 삭제
- 파일 처리 옵션
compress
순환된 로그 파일을 gzip으로 압축delaycompress
다음 로테이션 때까지 압축을 지연notifempty
빈 로그 파일은 순환시키지 않음missingok
로그 파일이 없어도 오류 발생시키지 않음
- 파일 생성 및 권한
create 권한 사용자 그룹
새 로그 파일 생성 시 권한, 소유자, 그룹 설정copytruncate
원본 파일을 복사 후 비움(짧은 시간에 일부 로그 유실 가능)dateext
파일명에 날짜 추가 (YYYYMMDD 형식)
- 스크립트 실행
prerotate/endscript
로그 순환 전 실행할 스크립트postrotate/endscript
로그 순환 후 실행할 스크립트
개별 서비스 설정하기
특정 서비스나 애플리케이션의 로그 파일에 대한 설정은 /etc/logrotate.d/
디렉토리에 별도의 파일로 관리한다
Nginx 웹 서버의 로그 설정 예시
/var/log/nginx/*.log {
daily # 매일 로그를 회전한다
rotate 7 # 최근 7일간의 로그를 유지한다
missingok # 로그 파일이 없어도 오류를 발생시키지 않는다
notifempty # 로그 파일이 비어 있으면 회전하지 않는다
compress # gzip 압축을 적용한다
delaycompress # 하루가 지난 로그부터 압축한다
dateext # 파일명에 날짜를 추가한다
copytruncate # 기존 로그 파일을 유지하면서 내용을 비운다
postrotate # Nginx 프로세스에 로그 변경을 알린다
kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Apache 로그 설정 예시
Apache 웹 서버의 로그 설정 예시
/var/log/apache2/*.log {
missingok # 로그 파일이 없어도 경고 없이 처리
daily # 로그 파일을 매일 로테이션
rotate 14 # 로그 파일이 최대 14개까지 유지
compress # 로그 파일을 압축
notifempty # 원본 로그 파일과 함께 삭제
maxage 30 # 30일 이후의 로그 파일은 삭제
copytruncate # 로그 파일을 복사하면서 원본 파일 비우기
dateext # 압축된 로그 파일에 날짜 확장자 추가
create 0644 root root # 로그 파일의 소유자와 그룹을 지정
}
Logrotate 실행 및 관리
수동으로 Logrotate 실행하기
Logrotate를 수동으로 실행하는 방법은 다음과 같다
# 모든 설정에 대해 logrotate 실행
sudo logrotate /etc/logrotate.conf
# 특정 서비스에 대해서만 실행
sudo logrotate /etc/logrotate.d/nginx
# 강제로 실행 (조건과 관계없이 로테이션 수행)
sudo logrotate -f /etc/logrotate.conf
# 디버그 모드로 실행 (실제로는 실행하지 않고 어떤 작업이 수행될지 표시)
sudo logrotate -d /etc/logrotate.conf
Cron을 이용한 자동 실행
기본적으로 logrotate는 cron.daily에 의해 매일 실행되지만, 원하는 주기로 변경할 수 있다
# 해당 명령어 실행
sudo crontab -e
# 아래 문장을 복사 붙여넣고, 저장
# 의미 = 매주 수요일 오전 2시에 logrotate 실행
0 2 * * 3 /usr/sbin/logrotate /etc/logrotate.conf
실행 상태 확인
Logrotate의 실행 상태 및 마지막 실행 정보는 다음 파일을 통해 확인할 수 있다
# 마지막 실행 로그 보기
cat /var/lib/logrotate/status
실전 응용 사례
도커 환경에서 Logrotate 설정
도커 컨테이너 내부에서 Nginx 로그 파일을 관리하는 설정
## 1. logrotate 설정 파일 작성
# nginx/logrotate-nginx 설정 파일
/var/log/nginx/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
dateext
copytruncate
postrotate
kill -USR1 `cat /var/run/nginx.pid`
endscript
}
## 2. cron 스크립트 추가
# nginx/logrotate-cron.sh
#!/bin/sh
# logrotate 크론 작업 추가
echo "0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx" > /etc/crontabs/root
# 크론 서비스 실행
crond -b -l 2
대용량 로그 파일 처리
대용량 로그 파일을 효율적으로 관리하는 설정
# copytruncate 옵션 사용 시 주의점
# 대용량 파일의 경우 copy 작업 동안 I/O 부하가 발생할 수 있음
/var/log/large-application.log {
size 100M # 100MB 이상이 되면 로테이션
rotate 10 # 10개 로그 파일 유지
compress # 압축
delaycompress # 다음 로테이션 때까지 압축 지연
missingok
notifempty
dateext # 날짜 포함 파일명
create 0644 appuser appgroup
}
커스텀 스크립트 실행
로그 로테이션 전후에 특정 작업을 수행하는 설정
/var/log/myapp.log {
daily
rotate 30
compress
missingok
create 0644 myappuser myappgroup
prerotate
# 로테이션 전 수행할 작업 (예: 애플리케이션 알림)
echo "Log rotation starting" | mail -s "Log Rotation" admin@example.com
endscript
postrotate
# 로테이션 후 수행할 작업 (예: 서비스 재시작)
systemctl reload myapp
endscript
}
고급 기술과 팁
size와 time 옵션 조합하기
크기와 시간 기반 로테이션을 함께 사용하는 방법
/var/log/application.log {
daily # 매일 검사
size 100M # 하지만 100MB가 넘었을 때만 로테이션
rotate 14
compress
notifempty
}
dateformat 옵션 사용하기
로그 파일 이름에 사용자 정의 날짜 형식 적용하기
/var/log/custom-app.log {
daily
rotate 30
dateext
dateformat -%Y%m%d-%s # 년월일-타임스탬프 형식으로 저장
compress
missingok
}
sharedscripts 옵션 활용하기
여러 파일에 대해 스크립트를 한 번만 실행
/var/log/netdata/*.log {
daily
missingok
rotate 14
compress
notifempty
sharedscripts # 여러 파일이 매칭되더라도 스크립트는 한 번만 실행
postrotate
/bin/kill -HUP `cat /var/run/netdata/netdata.pid 2>/dev/null` 2>/dev/null || true
endscript
}
logrotate 과정
위 과정이 어떤 순서로 이뤄지는지 시각화해보았다.
[원본 로그] → [크기 또는 시간 기준 확인] → [조건 충족 시 로테이션] → [압축 및 이름 변경] → [새 로그 파일 생성] → [기존 로그 파일 처리
logrotate 실사용
직접 사용해보고자 VM 구성하고 파일을 작성한 뒤에 다음과 같은 디버깅 명령어를 실행했다.
실제로 로그를 회전시키지 않고 설정이 제대로 적용되는지, 실행된다면 어떤 작업이 수행되는지 보여준다.
sudo logrotate -d /etc/logrotate.conf
결과는 다음과 같다.