logrotate 란?
Linux 환경에서 로그의 관리를 도와주는 CUI 기반의 도구이다.
사용자가 정한 주기마다 쌓인 로그를 아카이빙, 아카이빙된 파일의 갯수를 일정 갯수로 제한하는 등의 로그 관리를 하여, 스토리지 용량이 부족해지는 등의 문제를 방지할 수 있도록 한다.
logrotate 자체는 daemon이 아닌, 로그의 관리를 도와주는 단순 실행파일이므로, 주기적으로 알아서 작업할 수 있는 능력이 없다. 따라서, 반드시 Linux 내의 ‘crond’ 와 같은 스케줄러 설정이 필요하다.
그리고 /etc/logrotate.d 디렉토리에 각 로그파일마다의 logrotate 설정에 대한 파일들이 있는데, 여기에 ‘nginx’, ‘{Gunicorn으로 구동할 APP 이름}’ 으로 파일명을 하여 Nginx 및 Gunicorn 에 대한 logrotate 설정을 할 것이다.
Nginx logrotate 설정
# /etc/logrotate.d/nginx 파일
/etc/nginx/log/*.log {
daily
dateext
dateyesterday
rotate 60
missingok
compress
delaycompress
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}
위 logrotate 설정 파일의 해석은 다음과 같다.
- 맨 위 /etc/nginx/log/*.log : /etc/nginx/log 디렉토리에 있는 *.log 파일에 대해 다음 logrotate 옵션을 지정한다.
- daily : 매일 logrotate를 수행하여, 일별로 새로운 로그 파일이 생성되도록 한다.
- dateext : 로그 파일명에 ‘20231028’ 과 같은 날짜 형식을 추가하여 로그파일이 생성되도록 한다.
- dateyesterday : dateext로 붙는 날짜 형식에 하루 전날 기준으로 생성하도록 한다.
⇒ 이 옵션을 사용하지 않으면, logrotate를 수행한 해당 시점 기준으로 파일명에 날짜가 새겨져서 헷갈리게 된다. 예를 들면 2023.10.28. 에 logrotate를 하게 되면 결과로 생성된 로그 파일(ex) error.log-20231028)에는 2023.10.27. 의 로그들만 있는데, 이를 방지하고자 이 옵션을 사용하면, 2023.10.28에 logrotate를 한 결과 로그 파일명이 ‘error.log-20231027’로 되는 것이다. - rotate [숫자] : 해당 개수만큼만 로그 파일을 보관한다. 이 수를 초과하면, 오래된 로그부터 삭제된다.
- missingok : 로그 파일이 없는 경우에도 경고 없이 진행한다.
- compress : 로그 파일을 압축하여 저장한다.
- delaycompress : 다음 logrotate 가 진행되기 전까지 압축을 지연시킨다. ⇒ 2023.10.28. 에 logrotate 가 수행된다면, 이때 결과 파일로 생기는 로그 파일은 압축을 하지 않고(다음날인 2023.10.29.에 해당 파일이 압축된다.), 2023.10.27. 에 logrotate 수행한 파일을 압축하게 된다.
- notifempty : 로그 파일이 비어 있으면 로테이션하지 않도록 한다. 즉, 해당 날짜에 대한 새로운 로그가 생기지 않았다면, 로그 파일명 기준으로 해당 날짜에 대한 로그가 누락된 것처럼 보일 수도 있겠다…!
- create 0640 nginx nginx : logrotate 결과 생기는 파일에 대한 권한을 설정하는 것으로, 이 예시에서는 해당 로그 파일에 대해 0640 permission 으로 ‘nginx’ 유저, ‘nginx’ 그룹에 소유권을 부여한다는 의미이다.
- sharedscripts : 여러 로그 파일이 있는 경우, 한 번만 logrotate 를 수행하도록 하여, 이 옵션으로 지정된 logrotate 중복 수행을 방지하고, 실행시간 및 리소스 사용을 줄인다.
- postrotate : logrotate 수행 이후에 수행할 작업을 정의하는 구문으로, 위 예시에서는 nginx에 USR1 시그널을 보내어 log 파일을 re-open 함으로써, logrotate 수행 결과 생성된 로그 파일에 현재 구동중인 nginx의 로그가 계속하여 쌓이는 것을 방지한다.
- endscript : ‘prerotate’ ‘postrotate’ 와 같은 옵션 블록을 사용할 때, 이 블록에 속한 명령어나 스크립트의 실행 범위의 끝을 나타내는 키워드에 해당한다.
Gunicorn logrotate 설정
# /etc/logrotate.d/{Gunicorn으로 구동할 APP 이름} 파일
/apps/venvs/qa_portal/logs/*.log {
daily
dateext
dateyesterday
rotate 60
missingok
compress
delaycompress
notifempty
create 0640 gunicorn gunicorn
sharedscripts
postrotate
if [ -f /apps/venvs/qa_portal/qa_portal.pid ]; then
kill -USR1 `cat /apps/venvs/qa_portal/qa_portal.pid`
fi
endscript
}
crond 란?
Cron(주기적인 job 스케줄 실행을 위한 S/W 유틸리티)의 daemon 프로세스이다.
crond 는 기본적으로 아래와 같은 구조로 crontab 과 cron.d 의 수행해야 할 작업 내역을 불러와서 일정 주기마다 해당 작업을 수행한다.
필자는 간편하게 crontab을 활용하여 스케줄 job을 등록하고자 한다.
crontab
crontab은 cron의 실행주기 및 실행시간이 지정된 작업의 모음으로 아래와 같은 명령어 형식을 통해 스케줄 job을 등록할 수 있다.
* * * * * [실행 명령어 또는 쉘 스크립트]
# 첫번째 '*' : 0~59 의 숫자를 입력하여, **몇 분**에 해당 명령을 수행할 지 결정
# 두번째 '*' : 0~23 의 숫자를 입력하여, **몇 시**에 해당 명령을 수행할 지 결정
# 세번째 '*' : 1~31 의 숫자를 입력하여, 매달 **며칠**에 해당 명령을 수행할 지 결정
# 네번째 '*' : 1~12 의 숫자를 입력하여, **몇 월**에 해당 명령을 수행할 지 결정
# 다섯번째 '*' : 0~7 의 숫자 또는 [sun | mon | tue | web | thu | fri | sat] 중 하나 입력
# **무슨 요일**에 해당 명령을 수행할 지 결정 / 일:0,7 / 월:1 / 토:6
다음 명령어를 통해 nginx의 logrotate와 gunicorn의 logrotate를 매일 하루의 시작인 00시 00분에 수행하도록 해보자.
# crontab 스케줄 등록 (crontab -e)
# vi editor처럼 나타나는데 거기에 등록하려는 crontab 형식의 스케줄을 입력하고 :wq로 저장하면 된다.
crontab -e
# crontab -e 로 나오는 텍스트 에디터에서 다음을 입력하고 ':wq' 입력하여 저장 및 종료
# nginx의 logrotate를 crontab에 매일 오전 00:00 으로 등록
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
# Gunicorn으로 구동하는 App의 logrotate를 crontab에 매일 오전 00:00 으로 등록
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/{Gunicorn으로 구동하는 App의 logrotate 설정 파일명}
# 현재 crontab으로 걸려 있는 모든 스케줄 job 조회
crontab -l
참고
https://m.blog.naver.com/hello_world_study/221501251102
'Middleware > WSGI' 카테고리의 다른 글
[Gunicorn] gunicorn - nginx 연동 (1) | 2023.10.31 |
---|---|
[Gunicorn] RHEL9, Python 3.11 환경에서 Gunicorn(구니콘) 설치 (1) | 2023.10.29 |
최근댓글