Tomcat catalina.out log 분리하기 (feat. logrotate.d, SELinux)
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