개요
로그 파일 분석 요청을 처리하던 중 생성원리 및 설정이 궁금해 정리한다.
1. Tomcat 에서 log를 기록하는 방식, JULI
Java 1.4 부터 java.util.logging
이라는 java Logging Framework이 제공되었다. 여러 장점이 있는 반면에 JVM 레벨의 설정만 가능 하다는 단점이 있다. 즉, 웹 애플리케이션 단위로는 로그를 남길 수 없다는 것이다.
Tomcat 은 이러한 Java Logging 의 단점을 해결하기 위하여 Java Logging 을 확장한 JULI
라는 이름의 로그 관리를 사용하고 있다. 때때로 JULI 는 Java Logging 의 Tomcat 버전으로 표현되기도 하며, Java Logging 의 설정 방법과 기본적으로 동일하다. JULI 는 ${INSTANCE_DIR}/bin/tomcat-juli.jar
파일로 존재하고 있다.
2. logging.properties
log에 대한 설정을 담당한다. 파일은 다음 위치에 존재한다.
- ${INSTANCE_DIR}/conf/logging.properties : Java Logging 에 대한 설정 파일. 이 파일 경로는 Tomcat 에 의하여
java.util.logging.config.file
이라는 JVM 시스템속성으로 정의되어 있다. (만일 이 속성이 없다면 default ${JAVA_HOME}/lib/logging.properties 를 사용하게 된다.) - WEB-INF/classes/logging.properties : 각 애플리케이션의 설정 파일. 애플리케이션 별로 달라질 수 있다. (애플리케이션 로그를 log4j로 관리하는 경우 lolog4j2.xml 파일이 WEB-INF/classes 폴더에 있음을 확인할 수 있다.)
logging.properties 에 대한 설정 옵션은 하단 링크 참고 Access 로그의 경우 JULI
가 아닌 AccessLogValve 가 담당한다.
3. log 파일의 종류
log 파일은 별도의 설정이 없다면 ${INSTANCE_DIR}/logs 에 생성된다. 생성되는 로그 파일의 종류는 다음과 같다
- catalina.out
- catalina.yyyy-mm-dd.log
- manager.yyyy-mm-dd
- localhost_access_log.yyyy-mm-dd
- localhost.yyyy-mm-dd
- host-manager.yyyy-mm-dd
아래는 각 로그 파일에 대한 설명이다.
catalina.out
Tomcat 기동 시 ${INSTANCE_DIR}/bin/catalina.sh 에 의해 생성되는 로그 파일. 기본적으로 서버상 발생한 모든 내용을 기록 한다.
if [ -z "$CATALINA_OUT" ] ; then *CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out* fi … >> "$CATALINA_OUT" 2>&1 "&"
위 소스는 catalina.sh 의 스크립트이며 기동시 Standard Output 과 Standard Error 모두를 ${CATALINA_OUT}으로 보내는 것을 확인 할 수 있다. ${CATALINA_OUT}은 ${CATALINA_BASE}/logs 하위에 catalina.out 파일의 위치를 의미한다.
catalina.out
은 Tomcat 이 기동되어 있는 동안에는 단 하나의 파일에 계속 내용이 추가된다. 즉, 별도의 설정이 없을 때 이 파일의 크기는 무한정 증가하게 된다. 날짜별로 생성시키거나, /dev/null 로 생성하지 않는 방법으로 관리할 수 있다.
catalina.out
shutdown이 아닌 ServerDown 으로 종료(과부하로 인해 메모리 힙덤프를 남겼을때)시, Startup 시점에 덮어쓰기 되므로 주의한다.
catalina.yyyy-mm-dd.log
${INSTANCE_DIR}/conf/logging.properties 에 의하여 생성/제어 되는 로그 파일
Tomcat 에서 생성하는 로그만을 기록 한다. Tomcat System log라 할 수 있으며 Standard output, Standard error 의 로깅은 제외된다. (소스상 System.out.println 이나 System.err.println 으로 남기는 로그는 제외한다는 의미)
위 두 가지 로그만으로도 서버 모니터링이 가능하다. 운영시 다음 처럼 관리하는 것이 이상적이다.
- catalina.out 을 생성하지 않도록 catalina.sh 파일을 수정한다.
- Tomcat System log : catalina.yyyy-mm-dd.log 를 통해 모니터링
- Application log : FrameworkLog or Log4j 를 통해 데일로그로 운영
물론 위 상황은 이상적인 권고안일 뿐 catalina.out
을 데일리로 나누는 방법이 편할 수도 있다.
Access log (그외)
cilent의 Request를 기록하는 로그 파일이다. 접근브라우저 및 ip 등을 확인할 수 있다. Tomcat 배포 버전에 따라 이 AccessLogValve가 비활성화되어 있기도 하고, 활성화되어 있기도 하다. ${INSTANCE_DIR}/conf/server.xml 에서 활성화 여부를 확인할 수 있다.
참고자료
Apache Tomcat(톰캣) 로그에 대하여 (Java Logging과 JULI)
Tomcat 7.x와 8.x 간의 Default Configuration 비교
(이 블로그의 글은 내가 이해할 수 있는 수준에서 재정리한 것에 불과하므로 가능하면 꼭 원본글을 읽어보시기 바란다)