Linux+Tomcat8+log4j2でcatalina.outのサイズローテートできなかったからLog4jでがんばってみた

Tips

タイトル通り。
2017年6月初旬にこの作業したんだけど、数日間の終電帰りの大残業を強いられてしまったので、他の人が同じ轍を踏まないように書いておこうと思う。

今回使っているバージョン

今回使用しているバージョンを記載しておきます。

AWS EC2
Linux Centos7
Tomcat8.0.41
Java 1.8.0_121
log4j2 2.8.2、log4j2 2.7
log4j 1.2.17

結論から言うと、今はTomcat8+log4j2でサイズローテートはできない

log4j2 2.8時点でlog4j2のサイズローテートのトリガー SizeBasedTriggeringPolicy に不具合があるらしく、しかもまだ解消されていないらしい。

私が作業したときはlog4j2 2.8.2、log4j2 2.7でもダメだった。
エラーなくTomcatがサービス起動できてもうまくいく場合といかない場合があるので、使えなかった。

以下の記事をみつけたんですよね。(たどり着くまで2日かかった……。)

SizeBasedTriggeringPolicy is not working properly

This Jira has been LDAP enabled, if you are an ASF Committer, please use your LDAP Credentials to login. Any problems email users@infra.apache.org

この記事を見て、2017年02月28日時点でのコメント以降になにか変化があったら、解消されているかもしれない。log4j2が新しいバージョンをお使いの人は、上のリンクを確認してほしい。

OnStartupTriggeringPolicy、TimeBased Triggering Policyは問題なく動いた

OnStartupTriggeringPolicy、TimeBased Triggering Policyは問題なく動きました。

Tomcat8.5以上だと、Tomcat公式に書かれている手順だとlog4j2は動かない。
以下の記事を読んでほしい。この通りにやると動きました。(この記事にたどり着くにも1日かかった……。)

RE: Tomcat 8.5.4 and Log4j2

From: Mark Thomas Sent: Thursday, July 28, 2016 15:32 To: Tomcat Users List Subject: Re: Tomcat 8.5.4 and Log4j2 On 28/07/2016 20:09, Chen Levy wrote: > Hello all > > I’ve been using Tomcat 8.0.X with Log4j2, both for Tomcat logging and for my applicative logs, for a long time now.

log4jでもサイズローテートはだめ

んで、log4jでサイズローテートができるかやってみた。手順は公式のとおり。

Apache Tomcat 8

The internal logging for Apache Tomcat uses JULI, a packaged renamed fork of Apache Commons Logging that, by default, is hard-coded to use the java.util.logging framework. This ensures that Tomcat’s internal logging and any web application logging will remain independent, even if a web application uses Apache Commons Logging.

ただし、log4j2と同じように、うまくいくときといかないときがあって、安定しなかった……。
そして、たどり着いたのが、以下の中国語の記事。

tomcat 8.5.9.0 解决catalina.out过大的问题

先吐嘈一下tomcat这个项目,日志切割这么常见的功能,tomcat这种知名开源项目默认居然不开启,生产环境跑不了几天,磁盘就满了,而且很多网上流传的方法,比如修改conf/logging.properties文件,将级别设置成OFF,我试了好象并不管用(tomcat 8.5.9.0版本 + centos 6.5 + jdk1.8环境) 正确姿势: 1、下载 https://mirrors.tuna.tsinghua.edu.cn/apache/logging/log4j/1.2.17/log4j-1.2.17.tar.gz ,解压后,将其中的apache-log4j-1.2.17/log4j-1.2.17.jar 文件复制到{tomcat_home}/lib目录 2、下载 http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.39/bin/extras/tomcat-juli-adapters.jar 到{tomcat_home}/lib目录 3、在{tomcat_home}/lib下创建log4j.properties文件,内容参考下面这样: log4j.rootLogger=WARN, CATALINA # Define all the appenders log4j.appender.CATALINA=org.apache.log4j.RollingFileAppender log4j.appender.CATALINA.File=${catalina.base}/logs/catalina.log log4j.appender.CATALINA.MaxFileSize=10240KB log4j.appender.CATALINA.MaxBackupIndex=100 log4j.appender.CATALINA.Append=true log4j.appender.CATALINA.Encoding=UTF-8 log4j.appender.CATALINA.DatePattern=’.’yyyy-MM-dd-HH-mm’.log’ log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout log4j.appender.CATALINA.layout.ConversionPattern = %d [ %t ] %-5p %c- %m%n log4j.appender.LOCALHOST=org.apache.log4j.DailyRollingFileAppender log4j.appender.LOCALHOST.File=${catalina.base}/logs/localhost.log log4j.appender.LOCALHOST.Append=true log4j.appender.LOCALHOST.Encoding=UTF-8 log4j.appender.LOCALHOST.DatePattern=’.’yyyy-MM-dd’.log’ log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout log4j.appender.LOCALHOST.layout.ConversionPattern = %d [ %t ] %-5p %c- %m%n log4j.appender.MANAGER=org.apache.log4j.DailyRollingFileAppender log4j.appender.MANAGER.File=${catalina.base}/logs/manager.log log4j.appender.MANAGER.Append=true log4j.appender.MANAGER.Encoding=UTF-8 log4j.appender.MANAGER.DatePattern=’.’yyyy-MM-dd’.log’ log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout log4j.appender.MANAGER.layout.ConversionPattern = %d [ %t ] %-5p %c- …

やったことは以下のとおり。公式の手順に加えて、以下の手順を追加して行いました。

setenv.shにlog4j.propertiesの設定をする。

# vi /${TOMCAT_HOME}/bin/setenv.sh

JAVA_OPTS="$JAVA_OPTS -Dlog4j.configurationFile=file:///${TOMCAT_HOME_PATH}/lib/log4j.properties"

catalina.sh以下の通りに修正。(210行あたり)

# vi /${TOMCAT_HOME}/bin/catalina.sh

if [ -z "$CATALINA_OUT" ] ; then
#CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
CATALINA_OUT=/dev/null
fi

まとめ

まさか、ここまでどツボにはまるというか、えらい目にあった。新しいバージョンだから使えるとは限らないですね、ほんとに。

それに、今回は中国語サイトまで読むことになって、ほんとうにGoogle翻訳機能には助けられました。
翻訳でわからなかったところは、席替えでたまたま隣になった中国人のプログラマの人にも感謝……!

そして、先人の方々のアウトプットにホンマに感謝でした!

参考情報

SizeBasedTriggeringPolicy is not working properly

This Jira has been LDAP enabled, if you are an ASF Committer, please use your LDAP Credentials to login. Any problems email users@infra.apache.org

tomcat 8.5.9.0 解决catalina.out过大的问题

先吐嘈一下tomcat这个项目,日志切割这么常见的功能,tomcat这种知名开源项目默认居然不开启,生产环境跑不了几天,磁盘就满了,而且很多网上流传的方法,比如修改conf/logging.properties文件,将级别设置成OFF,我试了好象并不管用(tomcat 8.5.9.0版本 + centos 6.5 + jdk1.8环境) 正确姿势: 1、下载 https://mirrors.tuna.tsinghua.edu.cn/apache/logging/log4j/1.2.17/log4j-1.2.17.tar.gz ,解压后,将其中的apache-log4j-1.2.17/log4j-1.2.17.jar 文件复制到{tomcat_home}/lib目录 2、下载 http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.39/bin/extras/tomcat-juli-adapters.jar 到{tomcat_home}/lib目录 3、在{tomcat_home}/lib下创建log4j.properties文件,内容参考下面这样: log4j.rootLogger=WARN, CATALINA # Define all the appenders log4j.appender.CATALINA=org.apache.log4j.RollingFileAppender log4j.appender.CATALINA.File=${catalina.base}/logs/catalina.log log4j.appender.CATALINA.MaxFileSize=10240KB log4j.appender.CATALINA.MaxBackupIndex=100 log4j.appender.CATALINA.Append=true log4j.appender.CATALINA.Encoding=UTF-8 log4j.appender.CATALINA.DatePattern=’.’yyyy-MM-dd-HH-mm’.log’ log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout log4j.appender.CATALINA.layout.ConversionPattern = %d [ %t ] %-5p %c- %m%n log4j.appender.LOCALHOST=org.apache.log4j.DailyRollingFileAppender log4j.appender.LOCALHOST.File=${catalina.base}/logs/localhost.log log4j.appender.LOCALHOST.Append=true log4j.appender.LOCALHOST.Encoding=UTF-8 log4j.appender.LOCALHOST.DatePattern=’.’yyyy-MM-dd’.log’ log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout log4j.appender.LOCALHOST.layout.ConversionPattern = %d [ %t ] %-5p %c- %m%n log4j.appender.MANAGER=org.apache.log4j.DailyRollingFileAppender log4j.appender.MANAGER.File=${catalina.base}/logs/manager.log log4j.appender.MANAGER.Append=true log4j.appender.MANAGER.Encoding=UTF-8 log4j.appender.MANAGER.DatePattern=’.’yyyy-MM-dd’.log’ log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout log4j.appender.MANAGER.layout.ConversionPattern = %d [ %t ] %-5p %c- …