Tomcat catalina.out log 분리하기 (feat. logrotate.d, SELinux)

2023. 10. 1. 18:00실무이야기

Tomcat catalina.out log 분리하기 (feat. logrotate.d, SELinux)

내가 맡은 프로젝트의 운영서버에 catalina.out 파일의 크기가 어마어마하게 크다.

당장은 문제가 없겠지만 차후 유지보수 log 파일 열어볼 때도 수분이 걸리고 찾을 때 읽은 프로그램이 튕길 수 있기 때문에 이참에 내가 맡고 있는 프로젝트의 log 분리를 하겠다고 말한 뒤 분리했다.

(이런건 제발 오픈할때 제발 Default로 해주기를..)

 


(이런 파일 다운로드 받기도 힘들고 열기도 힘들고 찾기도 힘들다.)

 

 

1. Cron상태 확인(운영중인 서버에는 anacron이 설치되어 있는지 확인하기)

// crond이 돌고 있는 상태를 확인한다.
service crond status\

// anacrontab이 설치되어 있는지 확인
// 아래 anacrontab이 설치되어 있으면 cron형식이 출력된다.
cat /etc/anacrontab

 

 

 

2. /etc/logrotate.d 폴더내 파일 생성

$ vi tomcat_example

| /etc/logrotate.d 경로 내에 vi편집기로 파일을 생성한다.

아래 명령어를 적고 저장합니다.

 

 

 

/home/test/tomcat/log/catalina.out {
        copytruncate
        daily
        rotate 30
        dateext
        missingok
        compress
        notifempty
}

| { } 괄호 안에 원하는 명령어를 적는다.

일반적으로 위 명령어정도만 사용해도 여러분이 원하는 매일 log 분리하는게 됩니다.

기타 명령어는 아래 참고.

 

// 일단위로 실행(weekly, monthly)
daily

// catalina.out.1 catalina.out.2... 이렇게 되는것을 뒤에 숫자가 아닌 날짜로 변경(catalina.out-20221101)
dateext

//회전주기 설정 (현재는 5개 이상시 생성날짜가 오래된것부터 삭제해서 5개를 유지한다.)
rotate 5

// 로그파일의 내용이 없을경우 rotate 하지 않는다.
notifempty

//로그파일이 없을경우 에러메시지를 출력하고 다음으로 실행
missingok

// 로그파일을 gz로 압축
compress

// 여러개의 로그파일을 스크립트로 공유하여 실행합니다
sharedscripts
// 실행 후 스크립트 파일 실행합니다
postrotate
	/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2> /dev/null || true
// 실행 후 스크립트 파일 실행합니다
endscript

| 기타 더욱더 다양한 옵션은 아래 링크 참고를 하면 됩니다.

https://manpages.ubuntu.com/manpages/trusty/man8/logrotate.8.html

 

 

 

 

3. 실행전 디버그 모드 테스트

logrotate -d /etc/logrotate.d/tomcat_example

| logrotate의 명령어는 -f(강제수행), -d(디버그모드, 실제 수행은 안됨), -v(view 모드, logrotate가 상세 내역을 보여줍니다.) 가 있으며 실제로 Error가 있는지 없는지 확인하기 위해 처음에는 위에 처럼 -d 옵션으로 테스트 해봅니다.

 

4. logrotate 실행

logrotate -f /etc/logrotate.d/tomcat_example

| 문제가 없다면 처음 한번 -f 모드로 실행을 합니다.

제 기준에는 -f로 처음 실행하지 않으면 logrotate가 실행이 안되었습니다. 

 

 

기타. logroate 실행 확인

// Linux
cat /var/lib/logrotate.status

// Ubuntu
cat /var/lib/logrotate/status

| status 상태를 확인하게 되면 사진처럼 실행된 날짜/시간을 볼 수 있습니다.

 

 

 

 


SELinux으로 인해 logrotate가 작동하지 않을 수 있습니다.

필자가 운영서버에서 겪은 일인데 logroate 자체로는 굉장히 쉽고 간편하게 log 분리를 할 수 있었지만 운영서버에서 설정을 했고, 실제로 cron이 logroate돌렸는데 실제 확인으로는 log 분리 및 압축이 안되고 있었습니다.

그런데, logroate -f로 실행하면 문제없이 되었는데 cron으로 logroate로 안도는 원인이 SELinux라는 것을 알게 되었습니다.

SELinux는 /var/log 경로 이외에는 보안상 logroate가 안되도록 막아 놓았기 때문에 SElinux를 사용하면서 logroate도 할 수 있는 방법을 알려드리겠습니다.

 

 

1. logroate 에러 확인

cat /var/log/messages

| ALERT exited abnormally with [1]이라는 에러문구가 있으면 SELinux를 의심해 봐야 합니다.

 

 

2. SELinux 설치 확인

$ getenforce
	Enforcing
$ cat /etc/selinux/config
	SELINUX=enforcing

| 'getenforce' 명령어와 'cat /etc/selinux/config'을 통해 enforcing이라고 되어 있으면 SELinux가 활성화 되어 있습니다.

enforcing

  • SELinux의 기본값으로 활성화되어 보안정책이 실행되어 로그 기록과 보호를 모두 수행하는 상태

permissive

  • SELinux가 보안정책에 대하여 로그는 기록하지만 실제 차단되지 않는 상태

disabled

  • SELinux가 비활성화되어 동작하지 않는 상태

 

 

3. log를 분리할 target경로를 SELinux의 허용경로에 등록

// Context 확인
$ cat /etc/selinux/targeted/contexts/files/file_contexts.local
// 파일이 없으면 설정하면 되고, 있으면 실제 log 분리할 target이 있는지 확인합니다. 없으면 등록 단계로 갑니다.




////// 등록 단계 시작 //////

//var_log_t 경로 부여
$ semanage fcontext -a -t var_log_t '/home/test/tomcat/log(/.*)?'
// 위 명령어를 실행하면 '/etc/selinux/targeted/contexts/files/file_contexts.local' 파일이 생성된다.

// (경로)/아래의 파일에 대한 Context 재귀적으로 설정
$ restorecon -Frvv /home/test/tomcat/log

////// 등록 단계 끝 //////



// restorecon 확인(-Z : SELinux 보안 Context 출력)
// var_log_t로 변경되어 있으면 OK
$ ls -Z /home/test/tomcat/log/catalina.out
-rw-r-----. root root system_u:object_r:var_log_t:s0   catalina.out
-rw-r-----. root root system_u:object_r:var_log_t:s0   catalina.out-20221103.gz
-rw-r-----. root root system_u:object_r:var_log_t:s0   catalina.out-20221106.gz
-rw-r-----. root root system_u:object_r:var_log_t:s0   catalina.out-20221108.gz

(// Context 삭제시)
$ semanage fcontext -d "/home/app/acebed/mngwserc/logs111(/.*)?"

| /etc/selinux/targeted/contexts/files/file_contexts.local파일에 log 분리할 파일이 등록되어있는지 확인하고, 없으면 등록한 뒤에 restorecon 명령어로 Context를 재귀적으로 설정합니다. 

 

 

4. logrotate 실행

logrotate -f /etc/logrotate.d/tomcat_example

| 3번까지 설정 후 logroate가 안된다면 -f 모드로 처음 1번 강제 실행시킵니다.

 

 

5. 확인

| 필자는 SELinux가 설치된 서버에 logroate를 실행했습니다. 현재도 문제 없이 운영서버는 돌아가고 있으며, 지금은 압축되면서 매일 log가 쌓이고 있습니다. 행복 유지보수....♥

 

 


 

참고

https://access.redhat.com/solutions/39006

https://manpages.ubuntu.com/manpages/trusty/man8/logrotate.8.html