네른

[logrotate] 로그 로테이션 본문

DevOps

[logrotate] 로그 로테이션

네른 2022. 5. 12. 21:28

로그 로테이션. 말 그대로 로그를 회전시키는 것.

로그 파일의 크기가 너무 커지는 것을 방지하기 위해, 로그 파일을 분산/갱신 하는 과정을 의미한다.

 

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에서 마찬가지로 새 로그에 기록하도록 하는 부분.

Comments