logrotate는 Linux 환경에서 로그 파일을 자동으로 회전, 압축, 삭제 및 아카이빙하는 강력한 도구입니다. 이 도구는 로그 파일의 무한한 성장 방지를 위한 방법이며, 디스크 공간을 절약하고 기록을 추적할 수 있도록 도와줍니다. 이 문서에서는 logrotate의 사용법, 설치, 구성, 테스트, 자동화, 일반적인 문제 해결 방법 및 고급 기능을详细介绍합니다.
1. logrotate란 무엇인가?
logrotate는 다음과 같은 작업을 수행하는 시스템 도구입니다:
- 일정 시간 간격(일, 주, 월) 또는 파일 크기 기준으로 로그 파일을 회전.
- 구长 로그 파일을 압축(예:
.gz또는.xz형식). - 구 로그 파일을 삭제하여 디스크 공간을 확보.
- 회전 후 애플리케이션에 새 로그 파일을 다시 열도록 통지.
- 사용자 정의 스크립트를 통해 추가 작업 수행(예: 서비스 재시작).
이 도구는 시스템 로그(예: /var/log/syslog)와 웹 서버(예: Nginx, Apache) 로그 및 맞춤형 애플리케이션 로그를 관리하는 데 널리 사용됩니다.
2. logrotate 설치
ほとんどの Linux 배포판(예: Ubuntu, CentOS, Debian)은 기본적으로 logrotate를 설치하고 있습니다. 설치가 필요할 경우 다음 명령어를 사용합니다:
- Ubuntu/Debian:
sudo apt update
sudo apt install logrotate
- CentOS/RHEL:
sudo yum install logrotate
- 설치 확인:
logrotate --version
출력 예:
logrotate 3.18.0
3. logrotate 작동 원리
- 구성 파일:
- 주 구성 파일:
/etc/logrotate.conf, 전역 회전 규칙을 정의합니다. - 하위 구성 파일:
/etc/logrotate.d/디렉터리에 있는 파일, 특정 로그 파일에 대한 회전 규칙을 정의합니다. - 일정 실행:
cron또는systemd타이머가 일정 간격으로 실행하여logrotate를觸发.- 작업 단계:
- 로그 파일이 회전 조건(시간 또는 크기)을 충족했는지 확인.
- 구 로그 파일을 이름이 변경(예:
app.log→app.log.1). - 새 로그 파일을 생성.
- 구 로그 파일을 압축(예:
app.log.1.gz생성). - 보존 기간이 지난 구 로그 파일을 삭제.
- 사용자 정의 스크립트를 실행(예: 애플리케이션 통지).
4. 구성 파일 상세 설명
logrotate의 구성은 전역 구성과 하위 구성으로 이루어져 있습니다. 구성 파일은 단순 텍스트 형식이며, 로그 파일 경로와 회전 규칙을 지정합니다.
4.1 주 구성 파일
/etc/logrotate.conf는 전역 기본 규칙을 정의합니다. 예제:
weekly
rotate 4
create
compress
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
- weekly: 기본적으로 주말마다 회전.
- rotate 4: 4개의 과거 로그 파일을 보존.
- create: 회전 후 새 로그 파일을 생성.
- compress: 구 로그 파일을 압축(기본 압축 방식은
gzip). - include /etc/logrotate.d:
/etc/logrotate.d/디렉터리의 하위 구성 파일을 포함. - /var/log/wtmp { … }: 특정 로그 파일에 대한 회전 규칙을 정의.
4.2 하위 구성 파일
하위 구성 파일은 /etc/logrotate.d/ 디렉터리에 저장됩니다. 각 파일은 특정 애플리케이션 또는 로그에 대한 규칙을 정의합니다. 예를 들어, /var/log/myapp.log 파일에 대한 규칙을 정의하는 예제:
/var/log/myapp.log {
daily
rotate 7
size 100M
compress
delaycompress
missingok
notifempty
create 0640 root root
postrotate
/bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
구성 옵션 설명:
- /var/log/myapp.log: 회전할 로그 파일 경로(ワイル드카드도 지원, 예:
/var/log/myapp/*.log). - daily: 매일 회전(기타 옵션:
weekly,monthly). - rotate 7: 7개의 과거 로그 파일을 보존.
- size 100M: 로그 파일 크기가 100MB를 초과하면 회전.
- compress: 구 로그 파일을 압축.
- delaycompress: 압축을 지연(즉,
myapp.log.1은 압축하지 않고myapp.log.2부터 압축). - missingok: 로그 파일이 없으면 오류를 표시하지 않습니다.
- notifempty: 로그 파일이 비어 있으면 회전하지 않습니다.
- create 0640 root root: 회전 후 새 파일을 생성하며 권한을
0640, 소유자와 그룹을root로 설정. - postrotate … endscript: 회전 후 스크립트를 실행하며, 여기서는 애플리케이션에
HUP신호를 보내 새 로그 파일을 열도록 통지. - || true: 스크립트가 실패하더라도
logrotate의 실행을 중단시키지 않습니다.
4.3 하위 구성 파일 저장
하위 구성 파일을 创建:
sudo nano /etc/logrotate.d/myapp
上述 구성 내용을 붙여넣고 저장 후 퇴장. 파일 권한을 설정:
sudo chmod 644 /etc/logrotate.d/myapp
5. 일반적인 구성 옵션
logrotate가 지원하는 일반적인 명령어 목록:
- 시간 제어:
daily: 매일 회전.weekly: 매주 회전.monthly: 매월 회전.- 크기 제어:
size 100M: 파일 크기가 100MB를 초과하면 회전.maxsize 500M: 지정된 크기 이상이면 회전.- 파일 관리:
rotate <n>:<n>개의 과거 파일을 보존.create <mode> <owner> <group>: 새 파일을 생성할 때의 권한, 소유자, 그룹.nocreate: 새 파일을 생성하지 않습니다.missingok: 파일이 없으면 오류를 표시하지 않습니다.notifempty: 비어 있는 파일은 회전하지 않습니다.- 압축:
compress: 압축을 사용합니다.nocompress: 압축을 사용하지 않습니다.delaycompress: 압축을 지연합니다.compresscmd /usr/bin/xz:xz를 압축 도구로 사용합니다.compressext .xz: 압축된 파일의 확장자를.xz로 지정합니다.- 스크립트 실행:
prerotate/endscript: 회전 전 스크립트를 실행합니다.postrotate/endscript: 회전 후 스크립트를 실행합니다.firstaction/endscript: 일련의 파일을 처리하기 전에 한번 실행합니다.lastaction/endscript: 일련의 파일을 처리한 후에 한번 실행합니다.- 기타:
mail user@example.com: 회전된 로그를 지정된 이메일로 전송합니다.olddir /path/to/archive: 구 로그 파일을 특정 디렉터리로 이동합니다.maxage 30: 30일 이상된 파일을 삭제합니다.
6. logrotate 테스트
본격적인 운영 환경에서 작업 전에 구성을 테스트합니다:
- 디버그 모드:
sudo logrotate -d /etc/logrotate.conf
-d: 실제 파일을 수정하지 않고 회전 과정을 디버그 모드로 시뮬레이션.- 출력을 통해 규칙이 기대한 대로 적용되는지 확인합니다.
- 강제 실행:
sudo logrotate -f /etc/logrotate.conf
-f: 규칙을 즉시 실행하여 변경 사항을 적용합니다./var/log/디렉터리에 새 로그 파일(예:myapp.log)과 압축 파일(예:myapp.log.1.gz)이 생성되었는지 확인합니다.- 특정 하위 구성 파일 테스트:
sudo logrotate -d /etc/logrotate.d/myapp
7. 자동화된 회전
logrotate는 보통 일정 작업을 통해 자동 실행됩니다:
- Cron 작업:
- 기본적으로
/etc/cron.daily/logrotate스크립트가 실행됩니다. 내용을 확인:
cat /etc/cron.daily/logrotate
예제 내용:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
cron 서비스가 실행 중인지 확인:
sudo systemctl status cron
- Systemd 타이머(近代 시스템):
- 일부 시스템은
cron대신systemd타이머를 사용합니다. 타이머 상태를 확인:
systemctl status logrotate.timer
타이머를 활성화하고 시작:
sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
- 사용자 정의 작업:
- 더 자주 회전이 필요할 경우 사용자 정의
cron작업을 생성합니다:
sudo crontab -e
다음과 같이 추가(1시간마다 실행):
0 * * * * /usr/sbin/logrotate /etc/logrotate.conf
8. 실제 응用 예제
다음은 다양한 장면에서의 구성 예제입니다:
8.1 Nginx 로그 회전
Nginx의 접근 로그와 오류 로그를 회전하는 예제:
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 nginx adm
sharedscripts
postrotate
/usr/sbin/nginx -s reopen
endscript
}
- sharedscripts: 일련의 파일에 대해 스크립트를 단 한번만 실행합니다(ワ일드카드와 함께 사용 시 유용).
- nginx -s reopen: Nginx에게 새 로그 파일을 열도록 통지합니다.
8.2 크기 기준으로 회전
크기로 인해 급증하는 로그 파일에 대한 구성:
/var/log/bigapp.log {
size 500M
rotate 5
compress
create 0640 root root
postrotate
/bin/kill -HUP `cat /var/run/bigapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
8.3 특정 디렉터리로 아카이브
구 로그 파일을 특정 디렉터리로 이동:
/var/log/myapp.log {
daily
rotate 7
compress
olddir /var/log/archive
create 0640 root root
}
olddir 디렉터리 설정:
sudo mkdir -p /var/log/archive
sudo chown root:root /var/log/archive
sudo chmod 755 /var/log/archive
9. 일반적인 문제 해결
- 로그가 회전되지 않음:
- 구성 파일의 문법을 확인:
sudo logrotate -d /etc/logrotate.conf
cron작업이 실행 중인지 확인:
sudo systemctl status cron
- 로그 파일의 권한을 확인:
ls -l /var/log/myapp.log
notifempty가 활성화된 경우 로그 파일이 비어 있지 않아야 합니다.- 애플리케이션 이이 로그 파일을 다시 열지 않음:
postrotate스크립트가 올바르게 작동하는지 확인:
cat /var/run/myapp.pid
- 애플리케이션에
HUP신호가 올바르게 전달되는지 확인(애플리케이션 문서 참조). - 압축 파일이 많은 디스크 공간을 차지:
rotate값을 줄이거나 더 높은 압축률을 사용합니다:
compresscmd /usr/bin/xz
compressext .xz
- 구 로그 파일을 삭제합니다:
maxage 30
- 권한 오류:
create가 지정한 사용자와 그룹이 존재하는지 확인.olddir디렉터리의 권한을 확인.- 디버그 로그:
logrotate의 실행 로그는/var/log/syslog또는/var/log/messages에 기록됩니다:
grep logrotate /var/log/syslog
10. 고급 기능
- 다수의 로그 파일 그룹핑:
- 일련의 로그 파일을 함께 회전:
/var/log/myapp/*.log {
daily
rotate 7
compress
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
- 조건式的 회전:
- 크기와 시간을 조합하여 회전:
/var/log/myapp.log {
daily
size 100M
rotate 7
compress
}
이 로그는 매일 점검하며, 100MB를 초과하거나 시간이 도달하면 회전합니다.
- 이메일 통지:
- 회전된 로그를 이메일로 전송:
/var/log/myapp.log {
daily
rotate 7
mail user@example.com
}
- 상태 파일:
logrotate은/var/lib/logrotate/status파일을 통해 상태를 기록하며, 이 파일을 통해 회전 이력을 확인할 수 있습니다:
cat /var/lib/logrotate/status
상태 파일이 손상되었을 경우 삭제 후 재생성:
sudo rm /var/lib/logrotate/status
sudo logrotate -f /etc/logrotate.conf
11. 최선의 실천 방법
- 구성 테스트: 항상
-d디버그 모드로 먼저 테스트后再 운영 환경에서 실행. - 권한 관리:
0640과 같은 적절한 파일 권한을 설정하여 민감한 로그 노출을 방지. - 로그 아카이빙: Restic와 같은 백업 도구를 사용하여 압축된 로그를 정기적으로 아카이빙.
- 디스크 사용량 점검: 정기적으로 디스크 사용량을 확인합니다:
df -h /var/log
- 문서 참조:
man logrotate또는 공식 문서를 통해 더 많은 세부 정보를 확인.
12. 주의 사항
- 프로세스 호환성: 일부 애플리케이션(예: MySQL)은 특정한 재시작 명령이 필요할 수 있습니다. 애플리케이션 문서를 참조하세요.
- 디스크 공간:
/var/log와olddir디렉터리에 충분한 공간이 확보되어야 합니다. - 백업 전략: 회전 후 압축된 로그를 즉시 백업하여 실수로 삭제되는 것을 방지.
- 중복 회전 피하기: 동일한 로그 파일이 여러 구성 파일에 의해 회전되지 않도록 주의합니다.