Programming/리눅스

[리눅스] logrotate를 사용하여 날짜별 tomcat 로그 관리하기

cbw1030 2021. 12. 21. 23:48
반응형

스프링 웹 애플리케이션을 운영하는 경우에는 톰캣을 직접 설치(외장 톰캣)하고 catalina.sh을 커스터마이징함으로써 날짜별로 로그를 관리할 수 있습니다.

하지만 스프링부트 웹 애플리케이션을 운영하는 경우에는 내장 톰캣 방식이라 catalina.sh을 커스터마이징 하기가 힘듭니다. 

스프링 부트는 백그라운드로 배포할 때 명령어를 아래와 같이 사용합니다.

nohup java -jar demo-0.0.1-SNAPSHOT.jar &

 

nohup 명령어를 사용해서 배포를 할 때 로그가 저장되는 경로 및 로그 파일명을 지정하지 않으면 현재 위치에서 아래처럼 nohup.out으로 저장이 됩니다.

 

 

로그가 저장되는 경로 및 로그 파일명을 지정하려면 아래처럼 하면 됩니다. (단, 로그 파일을 저장하려는 경로는 존재한 상태여야 합니다.)

nohup java -jar demo-0.0.1-SNAPSHOT.jar > /home/logs/tomcat/server.log &

/home/logs/tomcat 경로에 server.log가 생긴 것을 확인할 수 있다.

 

실제 운영하는 서비스에서 server.log에만 로그가 계속 쌓인다면 로그를 분석하기에도 힘들고 용량이 커져서 서버에 부하가 걸릴겁니다. 그래서 톰캣 로그를 날짜별로 관리하는 것이 중요합니다.

 

logrotate

로그를 주기적으로 자동 관리해주는 프로그램입니다. 리눅스에 기본적으로 설치되어 있습니다.

설치되어 있지 않다면 설치 방법은 아래와 같습니다. (centos 기준)

yum install logrotate

 

logrotate 설정

/etc/logrotate.conf 파일을 열어보면 logrotate 관련 기본정보 및 설명들이 작성이 되어 있습니다.

# 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

# use date as a suffix of the rotated file
dateext

# 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.

 

logrotate는 logrotate.conf를 참조하여 기본적으로 /etc/logrotate.d 디렉토리에 있는 설정에 맞게 로그를 롤링/삭제/백업을 진행합니다.

logrotate.conf는 건들지 않아도 되고 /etc/logrotate.d 디렉토리에서 server라는 파일을 만들어서 logrotate 설정을 해보겠습니다.

/home/logs/tomcat/server.log {
    daily        # weekly(주 단위로 로테이트), monthly(월 단위로 로테이트)
    rotate 30    # daily인 경우 30일만 로그파일을 관리함(weekly인 경우는 30주 관리)
    copytruncate # (아래에서 자세히 설명)
    dateext      # 로테이트로 인해 생성된 파일명에 날짜를 부여
    notifempty   # 로그 파일에 내용이 없다면 로테이트 하지 않음
    missingok    # 로그파일이 없을 경우 에러메세지를 출력하고 다음으로 실행
    nocompress   # 로테이트로 인해 생성된 파일을 압축하지 않음
}

 

위 옵션 말고도 여러 옵션이 존재하는데 여기를 참고해주세요.

 

logrotate 실행

실행하는 방법은 총 4가지가 있습니다. 필자는 4번으로 진행했습니다.

/usr/sbin/logrotate -f /etc/logrotate.d/server  # (실행만함) 
/usr/sbin/logrotate -o /etc/logrotate.d/server  # (디버그 모드) 
/usr/sbin/logrotate -v /etc/logrotate.d/server  # (실행과정 화면에 표시) 
/usr/sbin/logrotate -vf /etc/logrotate.d/server # (실행 + 실행과정 화면에 표시)

 

 

/home/logs/tomcat 경로에 server.log 파일만 존재했는데 server.log-20211221 파일이 생성되었습니다.

 

logrotate 실행 여부 확인

logrotate가 잘 실행되고 있는지 확인하는 방법은 아래 파일을 실행하면 확인이 가능합니다.

vi /var/lib/logrotate/logrotate.status

 

잘 실행되고 있습니다

 

logrotate의 동작 방식

logrotate는 기본적으로 rename을 기반으로 동작합니다.

로테이트의 대상이 되는 로그 파일(server.log)을 찾은 다음 설정에 맞게 날짜 suffix를 붙이고 rename을 합니다.

rename은 기존 파일의 이름만 바꾸기 때문에 파일명이 변경된 파일(server.log-20211221)을 그대로 둔다면 이름이 바뀐 파일에 계속해서 로그가 쌓입니다.

이를 방지하기 위해 logrotate 설정 파일에 copytruncate를 설정을 하게 됩니다.

copytruncate는 rename을 기반으로 동작하면서 copy와 truncate 작업을 병행합니다.

 

https://brunch.co.kr/@alden/27 참고

 

copytruncate가 장점만 갖는 것은 아닙니다. copy 하는 크기가 GB이상 될 경우 I/O를 하는데에 있어 부하가 생길 수 있습니다. 따라서 쌓이게 될 로그의 예상 크기를 고려해서 사용하는 것이 좋을 것 같습니다.

 

 

참고 사이트

https://brunch.co.kr/@alden/27

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

 

반응형