[Linux] Tomcat catalina.out 날짜별 관리하기
catalina.out 날짜 별 로그 관리하기
- rotatelogs 사용하여 로그 나누기
- logrotate 사용하여 로그 나누기
- catalina.sh 에 date 포맷 추가하기
- Log4j2 RollingFile 사용하기
톰캣기반 어플리케이션을 개발하고 운영하다보면 catalina.out에 로그가 계속 쌓여서 그 크기를 관리하기 어렵고 보기도 불편하다. 톰캣 설정으로 서버 재시작시 catalina.out을 초기화 시킬수 있지만 이것도 또한 이전 로그가 남아 있지 않아 운영에 있어서 좋지 않다.
날짜별로 나누기 위에서는 위와 같이 4가지 방식이 있는데 프로젝트 상황이나 성향에 따라 사용하여 로그를 날짜별로 나눠서 관리하는 방법을 공유하고자 한다.
1. rotatelogs 사용하여 로그 나누기
Apache 에서 제공하는 로그를 나눠주는 기능이 rotatelogs 가 존재 한다.
catalina.sh 에 rotatelogs 를 추가 해줌으로서 간단히 catalina.out 을 날짜 별로 나눌수가 있다.
rotatelogs 위치 찾기(아파치를 리눅스에 깔면 /usr/sbin/rotatelogs 에 기본적으로 설치되어있다.)
find /| grep rotatelogs
톰캣 bin 경로로 이동
cd /{서버 경로}/tomcat/bin
catalin.sh 오픈
vi catalina.sh
CATALINA_OUT 문자열 찾아 수정하기
shift
if [ -z "$CATALINA_OUT_CMD" ] ; then
touch "$CATALINA_OUT"
else
if [ ! -e "$CATALINA_OUT" ]; then
if ! mkfifo "$CATALINA_OUT"; then
echo "cannot create named pipe $CATALINA_OUT. Start aborted."
exit 1
fi
elif [ ! -p "$CATALINA_OUT" ]; then
echo "$CATALINA_OUT exists and is not a named pipe. Start aborted."
exit 1
fi
$CATALINA_OUT_CMD <"$CATALINA_OUT" &
fi
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
-classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
else
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
-classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"
fi
버전마다 "$CATALINA_OUT_CMD" 있냐 없냐의 차이가 있지만 크게 다를게 없다.
아래와 같이 스크립트를 수정해준다.
변경전 : touch "$CATALINA_OUT"
변경후 : echo ""
변경전 : >> "$CATALINA_OUT" 2>&1 "&"
변경후 : 2>&1 "&" | {아파치 디렉토리 경로}/bin/rotatelogs "$CATALINA_OUT".%Y-%m-%d 86400 540 &
shift
if [ -z "$CATALINA_OUT_CMD" ] ; then
echo ""
else
if [ ! -e "$CATALINA_OUT" ]; then
if ! mkfifo "$CATALINA_OUT"; then
echo "cannot create named pipe $CATALINA_OUT. Start aborted."
exit 1
fi
elif [ ! -p "$CATALINA_OUT" ]; then
echo "$CATALINA_OUT exists and is not a named pipe. Start aborted."
exit 1
fi
$CATALINA_OUT_CMD <"$CATALINA_OUT" &
fi
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
-classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
2>&1 "&" | {아파치 디렉토리 경로}/bin/rotatelogs "$CATALINA_OUT".%Y-%m-%d 86400 540 &
else
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
-classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
2>&1 "&" | {아파치 디렉토리 경로}/bin/rotatelogs "$CATALINA_OUT".%Y-%m-%d 86400 540 &
fi
톰캣 재시작
./shutdown.sh
./startup.sh
아래와 같이 catalina.out 이 날짜별로 생성이 되는걸 확인할 수 있다. 간혹 아파치 설정이 꼬이거나 잘못되어있으면 톰캣 재시작은 문제가 없으나 젠킨스에 올라가서 서버를 재시작하는데 있어서 SSH에 안끊어 지는 경우가 있으니 설정을 주의해야한다.
2. logrotate 사용하여 로그 나누기
리눅스에서 기본적으로 log를 정리해주는 logrotate 를 제공해주고 있다.
rotate를 사용하여 특정 일자별/주기별/월별 등으로 순환주기를 줌으로 log를 자동으로 관리할수 있게 도와준다.
logrotate 는 아래와 같이 실행 순서가 존재 함으로 crontab에 올려서 사용하는 방법을 소개하고자 한다.
crontab -> cron.daily -> logrotate -> logrotate.conf -> logrotate.d
logrotate 환경설정
vi /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may be also be configured here.
순환주기, 파일명 등 logrotate을 설정할수 있고 include /etc/logrotate.d 정보를 가져와서 log를 정리하는데 사용한다.
cd /etc/logrotate.d
해당 경로에 파일 생성
vi 파일명
/{서버 디렉토리 경로}/tomcat/logs/catalina.out {
copytruncate // catalina.out을 초기화하고 백업파일 생성
rotate 30 // rotate 관리 파일은 30개로 제한
missingok // log 파일이 미존재해도 사용
notifempty // log 파일에 값이 없으면 순환 안함
dateext // catalina.out 뒤에 년월일 형태로 추가하여 파일 생성
dateformat .%Y%m%d%H%M // 년월일시분 형태로 추가하겠다.
}
위에 링크 걸어놓은 logrotate 설명을 보면 각 텍스트가 무슨뜻인지 알수가 있다.
logrotate 강제실행 하기(설정해놓은 주기 기다리지 않고 발생)
/usr/sbin/logrotate -f /etc/logrotate.d/파일명
위와 같은 파일명으로 로그가 나눠 줬음을 알 수 있다.
crontab 등록(crontab 에 등록하여 실행 순서의 우위를 가져 갈수 있다.)
crontab -e
crontab은 os에서 사용하는 cron을 기반으로 스케줄을 돌려주는 기능이다. 매일 00시에 로그를 나누는 스케줄을 추가하였다.
0 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/파일명
3. catalina.sh 에 date 포맷 추가하기
catalina.sh 470 라인 이후에 존재하는 두곳을 아래와 같이 변경하여 톰캣을 재시작 한다.
변경전 : "$CATALINA_OUT" 2>&1 "&"
변경후 : "$CATALINA_OUT"$(date '+%Y-%m-%d') 2>&1 "&"
4. Log4j2 RollingFile 사용하기
Log4j2를 사용하여 로그 파일을 관리하는 경우, 설정 파일에서 catalina.out 로그 파일이 잘못된 방식으로 회전되거나 초기화되지 않도록 설정합니다.
예시 Log4j2 설정 파일 log4j2.xml:
<RollingFile name="CatalinaOut" fileName="logs/catalina.out"
filePattern="logs/catalina-%d{yyyy-MM-dd}.out">
<PatternLayout>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
Log4j2 의 RollingFile 을 설정하여 pattern 을 통해 날짜별로도 로그를 관리 할수가 있다.
참조 : https://logging.apache.org/log4j/2.x/manual/appenders.html?
Log4j – Log4j 2 Appenders
facility String The facility is used to try to classify the message. The facility option must be set to one of "KERN", "USER", "MAIL", "DAEMON", "AUTH", "SYSLOG", "LPR", "NEWS", "UUCP", "CRON", "AUTHPRIV", "FTP", "NTP", "AUDIT", "ALERT", "CLOCK", "LOCAL0",
logging.apache.org