レッツトライ!しもしも

エンジニアときどきイラストレーターのしもしもがレッツトライ!したことを描くブログ

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

      2017/09/13

タイトル通り。
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日かかった……。)

[LOG4J2-1086] SizeBasedTriggeringPolicy is not working properly – ASF JIRA

The test creates 100 Excectuors on 32 threads. Each of those 100 workers is likely to pass through the SizeBasedTriggeringPolicy check before any data is written to disk. At a size of 30-32 bytes you are looking at over 3000 bytes to be written.

この記事を見て、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过大的问题 – 菩提树下的杨过 – 博客园

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- %m%n log4j.appender.HOST-MANAGER=org.apache.log4j.DailyRollingFileAppender log4j.appender.HOST-MANAGER.File=${catalina.base}/logs/host-manager.log log4j.appender.HOST-MANAGER.Append=true log4j.appender.HOST-MANAGER.Encoding=UTF-8 log4j.appender.HOST-MANAGER.DatePattern=’.’yyyy-MM-dd’.log’ log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [ %t ] %-5p %c- %m%n log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Encoding=UTF-8 log4j.appender.CONSOLE.layout = …

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

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

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

まとめ

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

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

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

参考情報

[LOG4J2-1086] SizeBasedTriggeringPolicy is not working properly – ASF JIRA

The test creates 100 Excectuors on 32 threads. Each of those 100 workers is likely to pass through the SizeBasedTriggeringPolicy check before any data is written to disk. At a size of 30-32 bytes you are looking at over 3000 bytes to be written.

tomcat 8.5.9.0 解决catalina.out过大的问题 – 菩提树下的杨过 – 博客园

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- %m%n log4j.appender.HOST-MANAGER=org.apache.log4j.DailyRollingFileAppender log4j.appender.HOST-MANAGER.File=${catalina.base}/logs/host-manager.log log4j.appender.HOST-MANAGER.Append=true log4j.appender.HOST-MANAGER.Encoding=UTF-8 log4j.appender.HOST-MANAGER.DatePattern=’.’yyyy-MM-dd’.log’ log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [ %t ] %-5p %c- %m%n log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Encoding=UTF-8 log4j.appender.CONSOLE.layout = …

シェアする

 - Tips , , ,