[DevOps] Nginx Logrotation 설정
안녕하세요? 정리하는 개발자 워니즈 입니다. 웹 서버를 운영하다보면, 로그 파일들이 무분별하게 쌓이는 문제가 있습니다. 이를 정리하기 위해서는 logrotation이라는 프로그램을 이용해야 하는데요. logrotation을 어떻게 설정하고 어떤식으로 활용하는지에 대해서 정리를 해보도록 하겠습니다.
Nginx에 관한 시리즈 포스팅은 아래에서 확인이 가능합니다.
- [DevOps] Nginx 컴파일 설치
- [DevOps] ansible nginx config 배포 구성
- [DevOps] Nginx Logrotation 설정
- [DevOps] Nginx GeoIP 모듈 적용
- [DevOps] Nginx Log Aggregation & Dashboard
- [DevOps] Nginx Rate Limit
- [DevOps] Nginx Lua module 사용법
1. Logrotation 이란?
간단하게 리눅스에서 사용할 수 있는 프로그램.
Logrotatefㅡㄹ 사용하면 특정 폴더에 쌓이는 로그를 날짜 별로 나누어서 관리를 할 수 있으며, 기준을 정하면 해당일 이전 로그는 삭제하여 시스템 용량을 낭비하지 않을 수 있습니다.
Logrotate 구조
- /etc/logrotate.conf : 로그 로테이트의 기본 설정 파일
기본 설정 : log는 주 단위로 백업 -> 4주동안 보관
# see "man logrotate" for details # 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 # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here.
- /etc/logrotate.d/ : 로그 로테이트의 개별 설정 파일이 들어있는 폴더
## syslog 예시 /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { missingok sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } ## custom 예시 ## test.txt를 rotation할시에 data.json파일도 강제적으로 날짜별 copy를 수행 /home1/test/apps/devops/logs/test.txt { daily missingok copytruncate dateext notifempty postrotate cp -p /home1/test/apps/devops/logs/data.json /home1/test/apps/devops/logs/data.json-`date +%Y%m%d.%H%M%S` endscript }
- /etc/cron.daily/logrotate : 로그 로테이트 작업 내역 로그
2. Logrotation 설정 방법
필자는 nginx log에 대해서 rotation설정을 진행했습니다.
- nginx logrotation 설정
/apps/nginx-1.20.1/logs/access_log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 root root
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
1️⃣ 로그 정리 대상 파일 : /apps/nginx-1.20.1/logs/access_log
2️⃣ daily : daily(매일), weekly(매주), monthly(매달), yearly(매년) 순환
3️⃣ missingok : 로그파일이 없을 경우에도 에러로 처리하지 않음
4️⃣ rotate 7 : rotate 파일 갯 수
5️⃣ compress : 순환된 로그파일 압축(gz)
6️⃣ delaycompress : 최근파일 외 전부 압축
7️⃣ notifempty : 로그파일이 제로인 경우 rotation하지 않음
8️⃣ sharedscripts : prerotate, postrotate 스크립트를 한번만 실행
9️⃣ postrotate : 로그파일 분할 후 실행할 script 지정 ( nginx 의 경우 SIGUSR1 을 받으면 로그 파일을 새로 읽으므로 새로 만들어진 로그 파일에 로그를 기록합니다. )
🔟 copytruncate : 대부분의 어플리케이션들은 SIGTERM을 받으면, 로그파일을 새로 만듭니다. copytruncate를 이용하면 원본파일을 지우지 않고, truncate(파일 크기를 0으로 만든다)한다.
3. Logrotation 설정 테스트
로그 로테이션 설정을 진행하고나서 설정 테스트를 하기 위해서는 아래와 같이 테스트를 진행합니다.
logrotate -d -f /etc/logrotate.d/nginx
- -d, –debug : 디버그 모드, 실제 로그 파일을 변경하지는 않고 처리 과정만 표시합니다.
참고
- nginx log를 rotate 해서 일자별로 관리(logrotate)
- logrotate이용하여 nginx 로그파일 분할관리하기
- logrotate를 이용한 로그 파일 관리
- 로그관리 Logrotate