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
'실무이야기' 카테고리의 다른 글
원격PC에서 AWS 배포 프로세스 개선(AWS, gdown 활용) (1) | 2024.10.27 |
---|---|
웹사이트 속도 개선기(CDN,gzip, JS CSS Minify) (0) | 2024.10.27 |
쿼리 튜닝(프로시저, 임시테이블, Index Range Scan) (1) | 2022.12.09 |