새벽을 밝히는 붉은 달

로그 관리 도구, logrotate 본문

Develop/Linux

로그 관리 도구, logrotate

자윰 2023. 9. 22. 00:39

1. 들어가며

hdfs에 로그 파일이 쌓이고 있었는데, 로그가 너무 많이 쌓여서 hdfs disk full로 인해 spark를 사용할 수 없었다. 이때 팀리더께서 제안을 해주셨던 방법 중 하나가 logrotate였는데, (결국에 다른 방법으로 해결하긴 했지만) 처음 접한 도구여서 한 번 정리를 해보고자 한다.

2. logrotate란

위에서 말했듯이 DBMS, 어플리케이션 서버, 웹 서버 등을 운영하다보면 자연스레 로그가 쌓이게 된다. 이슈 등이 발생했을 때 쌓인 로그들을 보면서 이슈의 원인이 무엇인지 파악하게 된다. 따라서 로그를 삭제하긴 힘든데, 그렇다고 계속 쌓이는 로그를 가만히 둘 수는 없다. 만약 계속 쌓이는 로그를 가만히 둔다면 서비스의 성능 저하가 오거나, 서비스가 아예 사용이 불가능한 상태가 될 수도 있다. 혹은 이슈가 생겼을 때, 로그를 확인하고 분석하는 것이 어려워질 수 있다. logrotate는 이런 큰 규모의 로그 파일들을 관리하기 위해 디자인된 도구이다.

 

logrotate는 다음과 같은 기능을 제공한다. 아래 기능들은 주기별로 이루어지거나, 혹은 일정 크기 이상 로그가 커졌을 때 이루어진다. 보통은 daily로 설정된 cron job에 의해 수행된다.

  • 백업
  • 압축
  • 아카이빙
  • 삭제
  • 메일링

logroate는 다음의 순서를 따라서 실행이 된다.

https://server-talk.tistory.com/271

logrotate의 파일 구조는 다음과 같다.

/usr/sbin/logrotate: 데몬 프로그램

/etc/logrotate.conf: logrotate 데몬 설정 파일

/etc/logrotate.d: logrotate 프로세스 설정 파일

/etc/cron.daily/logrotate: logrotate 작업내역 로그

 

rotate를 수행할 때 logrotate.conf 파일에서 기본 설정을 확인하고 logrotate.d 디렉토리 내부에 존재하는 설정 파일들을 진행한다. 따라서 logrotate를 추가하고 싶은 경우 logrotate.d 디렉토리 내부에 생성하면 된다.

3. logrotate.conf 살펴보기

리눅스에서 logrotate는 /etc/logrotate.conf 파일을 이용해서 설정할 수 있다. /etc/logrotate.conf의 파일을 처음 열었을 때의 내용은 다음과 같다.

위 내용을 하나씩 살펴보면 다음과 같다.

# rotate log files weekly
weekly

로그 파일을 얼마나 순환 시킬 것인지 기간을 정하는 부분이다. weekly 외에도 daily, monthly, yearly 설정이 가능하다. 

# keep 4 weeks worth of backlogs
rotate 4

rotate할 로그의 개수를 지정하는 부분이다. rotate 주기에 따라 진행된다.

# create new (empty) log files after rotating old ones
create

로그 파일을 정리한 후에 로그파일을 생성할지에 대한 여부이다.

  • create: 로그파일을 생성함
  • empty: 로그파일 생성 안함
# use date as a suffix of the rotated file
dateext

rotate된 파일에 날짜를 부여하는 옵션이다. 

# uncomment this if you want your log files compressed
#compress

로그 파일의 압축 여부를 지정할 수 있다. 압축하면 로그파일의 크기를 조절할 수 있다. 

  • compress: rotate되는 로그파일을 gzip으로 압축
  • nocompress: rotate되는 로그파일을 압축하지 않음
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

디렉토리를 지정해서 logrotate를 할 수 있다.

  • include [path]: logrotate 프로세스(데몬) 지정
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

사용자의 로그인/로그아웃 정보를 저장하는 wtmp 로그 파일의 rotate 설정이다.

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

로그인 실패 기록을 저장하는 btmp 로그 파일의 rotate 설정이다.

더 다양한 옵션은 다음 표와 같다. logrotate.conf 뿐만 아니라 logrotate.d 내에서도 사용이 가능하다. 이외에도 다양한 옵션은 아래 7. 더 자세한 내용에서 소개할 man page에서 확인할 수 있다,

옵션 설명 예시/비고
rotate [숫자] log파일이 [숫자]개 이상이면 삭제 예시: rotate 5
(default) rotate 0: rotate되지 않고 삭제
rotate -1: 삭제되지 않음
maxage [숫자] log파일이 [숫자]일 이상이면 삭제 maxage 30
size 지정된 용량보다 클 경우 로테이트 실행 size +100k
create [권한][유저][그룹] 로테이트 되는 log파일 권한 지정 create 644 root root
notifempty 로그 내용이 없으면 로테이트 하지 않음  
ifempty 로그 내용이 없어도 로테이트 default
hourly | daily |
weekly | monthly
rotate 주기  
compress 로테이트 되는 log파일을 압축 default는 gzip으로 압축
nocompress 로테이트 되는 log파일 압축 하지 않음  
delaycompress 프로그램이 log 파일에 대한 입력을 종료하지 못하고 일정 기간 계속 쌓아야 할 경우, log 파일에 대한 rotate를 다음 주기로 미룸 compress 옵션과 함께 쓰여야 함
compressext [확장자명] 압축된 백업로그파일에 지정할 확장자 설정  
compresscmd [압축명] 압축파일 지정 default는 gzip
cpmpressoptions [옵션] 압축프로그램에 대한 옵션 설정 gzip의 경우 default는 -9(maximum compression)
missingok log파일이 발견되지 않은 경우 에러처리 하지 않음  
dateext 백업파일의 이름에 날짜가 들어가도록 함  
copytruncate 로그 데이터를 새로운 파일로 카피하고, 기존 파일을 0으로 만들어서, 새 로그 저장용으로 사용(즉, 저장될 파일은 같음) 장점 : 앱이 로그 파일을 새로 열 필요가 없음. / 단점 : 카피를 하기 때문에 로그내용이 많은 경우 오랜 시간이 걸릴 수 있음
postrotate 로그 로테이션이 완료된 후에 실행될 스크립트 ex) 앱에 시그널을 보내서 로그 저장용 파일을 새로 여는 것
lastaction-endscript logrotate output을 생성하고 실행  
prerotate / endscript rotate 작업 전에 실행할 작업 설정  
postrotate / endscript rotate 작업 후에 실행할 작업 설정  
sharedscripts prerotate, postrotate 스크립트를 한번만 실행  
errors [메일주소] 에러발생 시 지정된 메일 주소로 메일 발송  
mail [메일주소] rotate 후 이전 로그파일을 지정된 메일 주소로 메일 발송  

4. logrotate.d 내 파일 생성하기

다음과 같은 예시로 생성해줄 수 있다.

/var/log/nginx/*.log {		# rotate를 수행할 로그들의 경로
    create 0640 nginx root	# 로그 파일 생성시 0644 권한, root 사용자, root 그룹으로 생성
    daily					# 로테이트 주기
    rotate 10				# 로그파일의 개수가 10개 이상이면 가장 오래된 로그파일을 삭제
    missingok				# 로그파일이 없어도 에러처리 안함
    notifempty				# 로그 내용이 없으면 로테이트 하지 않음
    compress				# 로테이트 파일 압축
    delaycompress			# 프로그램이 log 파일에 대한 입력을 종료하지 못하고 일정 기간 계속 쌓아야 할 경우, log 파일에 대한 rotate를 다음 주기로 미룸
    sharedscripts			# 로그 파일이 여러 개 있어도 스크립트를 공유하여 아래 postrotate 스크립트를 한 번만 실행
    postrotate				# 로테이트를 진행후 스크립트 실행
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript				# postrotate 종료 선언
}

5. logrotate 관련 명령어

logrotate 즉시 실행

# logrotate -f [logrotate.d 내 실행하고자 하는 logrotate 파일 경로]
$ logrotate -f /etc/logrotate.d/nginx

# 아래 명령어는 logrotate.d 내 모든 logrotate에 대해 실행함
$ logrotate -f /etc/logrotate.conf

logrorate 디버그

# logrotate -d [logrotate.d 내 실행하고자 하는 logrotate 파일 경로]
$ logrotate -d /etc/logrotate.d/nginx

# 아래 명령어는 logrotate.d 내 모든 logrotate에 대해 실행함
$ logrotate -d /etc/logrotate.conf

logrotate 실행 과정 확인

# logrotate -v [logrotate.d 내 실행하고자 하는 logrotate 파일 경로]
$ logrotate -v /etc/logrotate.d/nginx

# 아래 명령어는 logrotate.d 내 모든 logrotate에 대해 실행함
$ logrotate -v /etc/logrotate.conf

위 명령어를 실행하면 아래와 같이 실행 과정을 확인할 수 있다.

6. logrotate 관련 파일

리눅스에 logrotate를 설정하지 않아도 동작하고 있는데, /etc/cron.daily 에 다음과 같이 정의되어 있기 때문이다.

#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

다음과 같이 명령어를 입력하면 logrotate 가 cron으로 실행되었음을 로그를 통해 확인할 수 있다.

$ grep 'logrotate' /var/log/cron
Sep 17 03:17:02 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[32334]: finished logrotate
Sep 18 03:06:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[3833]: starting logrotate
Sep 18 03:06:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[3914]: finished logrotate
Sep 19 03:24:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[7513]: starting logrotate
Sep 19 03:24:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[7528]: finished logrotate
Sep 20 03:27:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[32331]: starting logrotate
Sep 20 03:27:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[32345]: finished logrotate
Sep 21 03:06:01 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[15069]: starting logrotate
Sep 21 03:06:02 ip-xxx-xx-xx-xxx run-parts(/etc/cron.daily)[15159]: finished logrotate

위의 cron 명령어에서 볼 수 있듯이 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf 에 있는 경로인 /var/lib/logrotate/logrotate.status 에 파일별 logrotate된 시각이 기록되어 있는 것을 확인할 수 있다.

(+ 나의 경우에는 cron에 설정된 state가 기록된 파일이 /var/lib/logrotate/logrotate.status 여서 여기서 확인했으나, 리눅스 설정상 default는 /var/lib/logrotate.status 이다.)

$ tail /var/lib/logrotate/logrotate.status
"/var/log/maillog" 2023-9-17-3:17:1
"/var/log/puppetlabs/masterhttp.log" 2023-8-18-5:0:0
"/var/log/puppet/masterhttp.log" 2023-8-18-5:0:0
"/var/log/secure" 2023-9-17-3:17:1
"/var/log/puppet/puppetd.log" 2023-8-18-5:0:0
"/var/log/nginx/access.log" 2023-8-18-5:0:0
"/var/log/messages" 2023-9-17-3:17:1
"/var/log/cron" 2023-9-17-3:17:1
"/var/account/pacct" 2023-8-18-5:0:0
"/var/log/httpd/access_log" 2023-8-18-5:0:0

7. 더 자세한 내용

더 자세한 내용은 man page에서 확인할 수 있다.

https://linux.die.net/man/8/logrotate

Reference 

logrotate를 활용하여 로그 관리하기

https://en.wikipedia.org/wiki/Log_rotation

리눅스 로그관리 - Logrotate

주기적 실행 작업 관리: cron (cron job) & logrotate

Crontab과 Logrotate를 활용한 로그 순환

[Linux] Logrotate 설명 및 설정 방법

 

'Develop > Linux' 카테고리의 다른 글

[WSL2] network is unreachable이 뜰 때  (0) 2021.03.14
[WSL2] 1. WSL2 설치하기  (0) 2020.09.29
[WSL2] 0. WSL2 입문기  (0) 2020.09.29
[WSL2] shopt: not found 가 발생했을 때  (0) 2020.09.06
Comments