톰캣 로그 종류 및 설정 방법 (catalina.out 주의할 점)
톰캣 로그 종류 및 설정 방법 (+ catalina.out 로그 파일 주의할 점)
최근 외장 톰캣에 프로젝트를 배포하고 운영화는 과정에서 톰캣 인스턴스의 /logs 디렉터리 하위에 여러 개의 로그 파일이 생기는 것을 확인하였는데요.
해당 포스팅에서는 Tomcat에서 생성되는 각각의 로그 파일 종류와 설정 방법, 추가로 'catalina.out' 로그 파일의 주의할 점을 함께 살펴보겠습니다.
Java Logging Framework와 Tomcat의 JULI
Java Logging Framework(java.util.logging)
Java 1.4부터 포함된 'java.util.logging' 패키지는 표준화된 로깅 기능을 제공하기 위해 도입되었습니다.
하지만 java.util.logging의 경우 JVM 레벨에서 설정이 이루어지기 때문에 애플리케이션 단위로 세분화된 설정이 어렵다는 단점이 있었는데요.
특히 서버 환경에서 여러 애플리케이션이 동시에 실행될 때 각각의 애플리케이션에 대해 개별적인 로그 설정을 할 수 없다는 문제점이 있었습니다.
Tomcat의 JULI
Tomcat은 위의 문제점을 해결하기 위해 java.util.logging을 확장하여 여러 웹 애플리케이션이 독립적으로 로그를 설정할 수 있는 확장된 로깅 메커니즘인 'JULI'를 도입하게 되었습니다.
JULI의 설정 방법은 java.util.logging의 설정 방법과 유사하지만 일부 Tomcat 전용 기능이 추가되었으며, JULI는 {INSTANCE_DIR}/bin/tomcat-juli.jar 파일로 존재하고 있습니다.
{INSTANCE_DIR}/conf/logging.properties 파일을 통해 Tomcat의 기본적인 로깅 설정을 적용할 수 있으며, 각각의 애플리케이션에 대해 개별 설정이 필요한 경우 해당 애플리케이션의 /WEB-INF/classes 디렉터리에 logging.properties 파일을 배치하여 개별 설정을 사용할 수 있습니다.
(WEB-INF/classes/logging.properties)
Tomcat Log 파일 종류
- catalina.out
- catalina.yyyy-mm-dd.log
- localhost.yyyy-mm-dd.log
- localhost_access_log.yyyy-mm-dd.txt
- manager.yyyy-mm-dd.log
- host-manager.yyyy-mm-dd.log
톰캣 로그 파일의 종류는 다음과 같으며, 별도의 설정이 없는 경우 {INSTANCE_DIR}/logs 디렉터리에 생성됩니다.
1. catalina.out
Tomcat의 표준 출력(standard output)과 표준 에러 출력(standard error)을 기록하는 파일로 톰캣 서버가 구동되면서 발생하는 모든 콘솔 출력이 포함됩니다.
톰캣 기동 시 {INSTANCE_DIR}/bin/catalina.sh 파일로부터 생성되며, 다른 로그 파일들과 다르게 날짜별로 파일이 분리되지 않는다는 특징이 있습니다.
(서버의 시작, 종료, 배포된 애플리케이션에서 발생하는 표준 출력, 오류 메시지 등)
2. catalina.yyyy-mm-dd.log
'catalina.out' 로그 파일과 다르게 톰캣 서버의 내부 로그 메시지를 기록하는 데 사용되며, 주로 catalina 엔진의 로그를 포함합니다.
표준 출력과 표준 에러 출력은 기록되지 않습니다.
(배포된 애플리케이션에서 발생하는 표준 출력 또한 기록되지 않습니다.)
catalina.out 로그 파일은 하나의 파일에 계속 저장되는 반면, 'catalina.yyyy-mm-dd.log' 파일은 날짜에 따라 생성되어 기록됩니다.
3. localhost.yyyy-mm-dd.log
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
...
</Host>
Tomcat이 관리하는 호스트 중 특정 호스트에서 발생하는 로그 메시지를 기록합니다.
톰캣의 각 호스트는 {INSTANCE_DIR}/conf/server.xml 파일에 정의되며, 기본적으로 localhost가 정의되어 있습니다.
(추가적으로 여러 호스트를 설정할 수 있으며, 각 호스트는 각각의 로그 파일을 가질 수 있습니다.)
4. localhost_access_log.yyyy-mm-dd.txt
0:0:0:0:0:0:0:1 - - [23/Jun/2024:11:50:52 +0900] "GET /demo/test/select/1 HTTP/1.1" 200 5
0:0:0:0:0:0:0:1 - - [23/Jun/2024:11:50:55 +0900] "POST /demo/test/insert HTTP/1.1" 200 5
해당 로그 파일은 톰캣 서버의 접근 로그를 기록하는 데 사용됩니다.
클라이언트의 IP 주소, 요청 시간, 요청된 URL, HTTP 상태 코드, 응답 시간 등의 HTTP 요청 및 응답과 관련된 정보가 포함됩니다.
* access 로그의 경우 JULI가 아닌 AccessLogValve가 담당한다는 특징이 있습니다.
5. manager.yyyy-mm-dd.log
Tomcat Manager Web App 로그를 기록하는 데 사용됩니다.
tomcat-9.x.x 버전까지는 톰캣 실행 시 기본적으로 생성되었으나 tomcat-10.x.x 버전부터는 Manager Web App 관련 로그가 발생하는 시점에 로그 파일이 생성되는 것을 확인했습니다.
6. host-manager.yyyy-mm-dd.log
Tomcat Host Manager Web App 로그를 기록하는 데 사용됩니다.
마찬가지로 tomcat-9.x.x 버전까지는 실행 시 기본적으로 생성되었으나 10.x.x. 버전부터는 Host Manager Web App 관련 로그가 발생하는 시점에 로그 파일이 생성되는 것을 확인하였습니다.
catalina.out 로그 파일의 주의사항
앞서 이야기한 것처럼 'catalina.out' 로그 파일의 경우 날짜별로 분리되지 않고 한 파일에 계속해서 로그 내용이 누적되기 때문에 파일의 크기가 계속 커지며, 필요한 특정 로그 내용을 찾기 어려운 등의 문제가 발생할 수 있습니다.
해결 방법 1.
-- {INSTANCE_DIR}/bin/catalina.sh 파일 내용 중 일부
-- 수정 전 기본 설정
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi
-- catalina.out 로그 파일이 생성되지 않도록 수정한 설정
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="/dev/null"
fi
때문에 표준 출력(standard output)과 표준 에러 출력(standard error) 출력에 대한 기록이 필요하지 않고 필요한 내용을 따로 남기는 경우 위와 같이 {INSTANCE_DIR}/bin/catalina.sh 파일의 catalina.out 로그 파일 부분을 "/dev/null"로 수정하여 해당 파일이 생성되지 않도록 할 수도 있습니다.
해결 방법 2.
{INSTANCE/DIR}/bin/catalina.sh 파일의 내용을 다음과 같이 수정하여 기존의 catalina.out 로그 파일이 날짜별로 생성되도록 처리할 수 있습니다.
touch "$CATALINA_OUT" -- 주석 처리
echo "Do not touch $CATALINA_OUT" -- 새로 추가
>> "$CATALINA_OUT" 2>&1 "&" -- 주석 처리
2>&1 "&" | /usr/sbin/rotatelogs "$CATALINA_OUT"-%y-%m-%d.log 86400 540 & --새로 추가
436 라인의 touch "$CATALINA_OUT" 부분을 주석처리 해주고 아래 부분을 추가로 입력합니다.
또한 464, 474 라인의 >> "$CATALINA_OUT" 2>&1 "&" 부분을 주석처리하고 아래 부분을 추가로 입력합니다.
여기서 86400(1일)은 초 단위로 로그를 분리하는 시간을 의미하며, 540은 GMT 표준시를 한국 시간 기준으로 조정하기 위한 옵션입니다.
해결 방법 3.
/{catalina.out 로그 파일이 위치한 전체 경로}/catalina.out {
copytruncate
daily
rotate 30
compress
missingok
dateext
}
다른 방법으로는 리눅스 서버의 경우 /etc/lograte.d 디렉터리에 /etc/lograte.d/tomcat-log와 같은 설정 파일을 생성하여 위와 같은 logrotate를 통해 catalina.out 로그 파일을 날짜별로 분리되도록 처리할 수도 있습니다.
logging.properties 설정을 통해 불필요한 로그 파일 생성 안되게 하는 방법
그 외에 로그 파일(catalina.yyyy-mm-dd.log, localhost.yyyy-mm-dd.log, manager.yyyy-mm-dd.log, host-manager.yyyy-mm-dd.log)의 경우 {INSTANCE_DIR}/conf/logging.properties 설정 파일의 해당 부분을 통해 불필요한 로그 파일에 대한 내용을 주석처리 함으로써 로그 파일이 생성되지 않게 처리할 수 있습니다.
< 참고 자료 >
https://tomcat.apache.org/tomcat-8.5-doc/logging.html
https://sarc.io/index.php/tomcat/900-apache-tomcat-java-logging-juli
http://yellow.kr/blog/?p=4792