[logrotate] 로그 로테이션
로그 로테이션. 말 그대로 로그를 회전시키는 것.
로그 파일의 크기가 너무 커지는 것을 방지하기 위해, 로그 파일을 분산/갱신 하는 과정을 의미한다.
Spring과같은 다양한 애플리케이션들은 기본적으로 로그 로테이션 방법을 내부적으로 지니고 있다.
그런데 만약 없다면?? 예를들어 database들
그런 것들을 위해 사용되는거이 리눅스의 기본 패키지 중 하나인 logrotate이다.
logrotate는 cron을 기반으로 돌아간다고 생각하면 되는데, 당연하게도 주기적으로 로그를 갱신해야되므로 필요하다.
간단하게 구조를 보면
cron의 동작을 기술하는 부분 중, cron.daily 폴더 내부를 보면 logrotate파일이 있는 것을 볼 수 있다.
그리고, 해당 파일의 내부에는 /etc/logrotate.d 폴더 내의 파일들을 사용하라고 되어있다.
그래서! 그 폴더에 가보면, 기본적으로 nginx 와 관련된 디폴트 파일이 있다.
여기에 별도의 파일들을 생성해서 기록해두면 logrotate가 해당 파일의 설정값을 읽어 cron과 함께 동작하게 되는 것.
간단하게 사용했던 내용을 확인해보면 다음과 같다.
/var/tmp/test/*.log {
su root root # 로테이션 작업을 수행할 사용자를 지정
daily # 작업의 주기 지정
missingok # 로그파일이 없다면 생성
rotate 52 # 최대 저장할 파일의 수
compress # 지난 로그들은 gzip으로 압축
delaycompress # 로그를 우선 저장하고, 이후에 압축. 압축중에 파일이 추가되는것을 방지하기 위함.
notifempty # 로그파일이 비어있다면 로테이션하지 않음
create 644 root root # 새 로그파일을 만들 때의 소유자 정보
sharedscripts # 대상이 되는 로그파일이 여러개라도, 스크립트는 단 한번만 실행
postrotate # 로테이션 이후 실행할 스크립트의 내용
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
위 파일은 nginx 파일을 대체한 부분인데 관련 내용은 주석을 보면 된다.
한 가지 별도로 설명할건 postrotate 스크립트의 내용인데,
nginx가 기존에 아카이브된 로그파일에 계속 이어서 로그를 쓰려하는 성격이 있어서 nginx한테 그거 그만쓰고 새 로그에 기록하도록 재시작 시키는 것.
/경로/mariadb.log /경로/mariadb.err{
su mysql mysql
create 644 mysql mysql
notifempty
daily
rotate 20
missingok
compress
delaycompress
postrotate
if test -n "`ps acx|grep mysqld`"; then
/usr/bin/mysqladmin flush-logs -u root -p$MYSQL_ROOT_PASSWORD
fi
endscript
}
mariadb에 대해서 사용할때는 이런식으로 사용하면 된다.
다른점이라면 로그 소유주나 생성자 등등을 mysql로 해서 권한문제가 없게 하는 것과 postrotate에서 마찬가지로 새 로그에 기록하도록 하는 부분.