티스토리 뷰
1. logrotate란?
서버를 운영하다 보면 의도치 않은 서버의 상태 변경이나 장애가 발생한다. 이에 대비하기 위해 가능하면 서비스의 모든 로그(LOG)를 남기도록 설정한다.
하지만 서버에는 저장해야할 다양한 로그들이 있으며, 별도의 설정을 하지 않으면 시간이 지나면 이 로그들이저장공간 대부분을 차지하게 된다. 서버의 용량을 모두 잡아먹을 정도로 커지기 전에 로그들을 잘 관리하도록 설정하는 기능이 logrotate다.
2. 설치 및 실행 순서
기본적으로 Linux에 설치되어 있다곤 하는데 apt로도 설치가 가능하다.
apt install logrotate
cron.daily 아래의 /etc/cron.daily/logrotate logrotate 설정을 등록해놓고 매일 실행시켜 사용한다. 설치하면 자동 생성된다고도 한다.
EC2 Ubuntu에는 자동으로 설치되어 있고, cron에도 이미 등록되어 있다.
3. logrotate 설정 파일
logrotate를 설치했을 때, 몇 가지 설정 파일들이 자동으로 생성된다. logrotate의 기본 설정 파일은 /etc/logrotate.conf이고, 개별 파일 관련 로그 설정 파일들은 /etc/logrotate.d에 있다.
- /etc/logrotate.conf
# 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
# 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.
위 파일은 디폴트로 생성되는 파일로 이 파일 내의 include /etc/logrotate.d 명령어로 개별 파일 로그 설정들이 있는 경로를 불러온다.
3-1. httpd 로그 설정하기
사실 이 글을 작성하기 시작한 이유가 apache 웹서버 내에서 로그가 자동으로 쌓이고, 압축하는 것을 알아보기 위해서여서, 이 서버에서 추가된 httpd 설정만 따로 열어봤다.
- /etc/logrotate.d/httpd 를 생성해, apache httpd의 로그 파일을 설정할 수 있다.(파일명은 달라도 됨)
[로그 경로]/httpd/logs/*log {
daily # 매일 실행
rotate 90 # 90개 기준
create 0640 svcapp svcapp # create [권한][유저][그룹]
dateext # 확장자앞에 timestamp를 붙임
compress # 기간이 지난 파일 삭제하지말고 압축
compressext .gz #확장자는 .gz
delaycompress # 최근파일외 전부압축
missingok # 로그파일분실시 에러로 인정안함
notifempty # 로그파일이 제로인경우 분할하지않음
sharedscripts # 한세트의 로그파일에 한번만 로그분할작업 실행
postrotate # 로그파일분할후 실행할 script지정
/bin/kill -HUP `cat [로그 경로]/httpd-2.4.52/logs/httpd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
사실 여기가 logrotate 설정의 본체이다. /etc/logrotate.conf에도 같은 설정들이 있었는데, 별도의 설명을 하지 않고 넘어간 이유가 여기서 재등장하기 때문이다. 공식 사이트인지는 모르겠는데, 더 다양한 옵션이 있고 여기에 있다.
postrotate의 스크립트를 요약하면 로그 파일을 분할한 이후 httpd 아래의 pid를 가져와 프로세스를 죽이는 과정이고, 만약 실패해도 무시란 뜻이다. 이에 대해 자세히 알고 싶으면, postrotate 명령어 링크 확인
4. cron 등록
앞서 언급한 것 처럼 logrotate를 설치하면(혹은 이미 설치되어 있음) /etc/cron.daily/logrotate 파일이 생성된다.
- 아래가 default 파일이라고 함
#!/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
- /user/sbin/logrotate logrotate의 실행파일로 실행, /etc/logrotate.conf 경로의 설정파일을 가져온다.
- 아래 스크립트는 logrotate가 실패했을 때 로그를 남긴다.
- 만약 비정상적으로 로그생성이 종료되면, 리눅스 자체 log 생성기인 /usr/bin/logger로 logrotate 태그로 위 메시지를 남긴다.
- /usr/bin/logger 의 로그 경로는 /var/log/ 아래에 있다.
- /var/log에 쌓이는 로그도 logrotate에서 로그를 제거해준다. /etc/logrotate.d/syslog 에 설정이 있는데, 내부에 별다른 설정이 없어 디폴트 설정을 따라 6개씩 보관한다.
4-1. anacrontab
일반적인 리눅스의 스케쥴링은 crontab에 등록하고 동작한다. 그런데, logrotate가 등록된 cron.daily는 추가 동작을 설정해야 되서인지 crontab엔 등록하지 않고, anacrontab에 추가한다.
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
run-parts 명령어는 지정한 이렉터리 안에 있는 실행 권한이 있는 스크립트를 모두 실행하는 옵션인데 nice는 아직 잘 모르겠다.
anacron과 cron의 가장 큰 차이는, cron은 정해진 시간에만 동작해서 서버가 꺼져있으면 해당 시간에 동작하지 않지만, anacron은 시스템이 꺼져 있어도 재기동 됐을 때, 한번에 실행된다. 시스템을 켜면 누락된 작업이 한번에 실행된다.
위와 같은 특성 때문에, cron 작업은 매일 실행되는 서버에 적합하고 anacron은 사용하지 않을 때 전원이 꺼지는 경우 적합하다. 또한 cron은 더 세분화되어 매우 특정한 시간에 작업을 실행할 수 있는 반면 anacron은 최소 시간 간격이 하루에 한 번이다.
5. 마치며
리눅스 자체 스케줄링과 로그 처리에 대해 알아봤다. logrotate 외에도 rotatelogs 등 다양한 로그 처리 장치들이 있다. 서버 configuration 파일에 추가하는 것 만으로 간단히 사용할 수 있는 것도 있으니 상황에 맞게 사용하면 될 것 같다.
참고자료
- https://blog.leocat.kr/notes/2018/12/21/check-logrotate-execute-result
- https://www.nemonein.xyz/2020/05/3778/
- https://webdir.tistory.com/175
- https://www.putorius.net/cron-vs-anacron.html
'개발 > 개발팁' 카테고리의 다른 글
포스트맨(Postman) API 반복 요청하기 (0) | 2023.01.22 |
---|---|
Windows 10에서 Apache Jmeter 사용하기 (0) | 2023.01.21 |
[Javascript] Object.isEmpty (0) | 2023.01.18 |
[Javascript] Object Copy, structuredClone(), 깊은 복사 (0) | 2023.01.18 |
[JAVA] Array to ArrayList, ArrayList to Array (0) | 2023.01.01 |
- Total
- Today
- Yesterday
- openAI API
- serverless
- terraform
- EKS
- 오블완
- Log
- AWS
- 람다
- 스프링부트
- Elastic cloud
- java
- cache
- S3
- MySQL
- lambda
- 후쿠오카
- elasticsearch
- AOP
- OpenFeign
- Spring
- springboot
- Kotlin
- JWT
- GIT
- ChatGPT
- AWS EC2
- CloudFront
- 티스토리챌린지
- OpenAI
- docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |