Javaでlog4jを使ってログを出力させてます。
Javaでlog4jを使ってログを出力させてます。
複数のログを出力したいので、同一propertiesに複数のAppenderを定義しています。
内容は以下の通りです。
log4j.logger.processA=DEBUG, A
log4j.appender.A=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A.File=a.log
log4j.appender.A.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.A.Append=true
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n
log4j.logger.processB=DEBUG, B
log4j.appender.B=org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File=b.log
log4j.appender.B.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.B.Append=true
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n
log4j.logger.processC=DEBUG, C
log4j.appender.C=org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File=c.log
log4j.appender.C.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.C.Append=true
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n
processAやらprocessB、processCは同一サーバ内で非同期で動くプロセスです。
つまり、動作するプロセス毎にログ出力先を変えてます。
各プロセスを動かすと、ちゃんと想定したログファイルに出力されるんですが、
ローテートの時に「log4j:ERROR Failed to rename ~」のエラーが出て、
正常にローテートしません。
なぜだろうと思って、一度全てのログファイルを削除して、
processAだけ動かしてみました。
すると、a.logだけが出力されると思いきや、
b.logとc.logまで0kbではありますが出力されたんです。
つまり、データこそ出力しないけど、
他プロセスで出力するファイルをロックしてたんです。
これって、同一propertiesに書いているのが悪いんでしょうか?
それとも、設定が不足している為、そうなってしまってるんでしょうか?
ご存知の方、お知恵をお貸し下さい。
お礼
今回環境上の問題でlog4jを使えませんでしたが、 log4jを使える環境で、また似た様なことがありましたら DailyRollingFileAppenderを使ってみたいと思います。
補足
log4jが設定どころか、ライブラリ自体存在しない状況 でしたので、(というか、他のログ管理は全て、logging.loggerで作られていたので、 コレだけのためにlog4jを導入するのは仕様上+時間上無理でした。) 結局: 1ファイルを日付単位で保存 ファイルを日付単位で保存することにより ファイル作成日=ログ書込日=最終更新日になるので 同一dirにあるログファイルを全検索 ファイル拡張子がlogでかつ、 最終更新日が三ヶ月前のファイルを削除 という方法に…。 で、 この方法だと毎度ロジックが走ってしまうので、 2同一dirにロックファイル作成 ロックファイルの最終更新日を取得し 現在日付と同一でなかったらファイルに"1"を上書きし 上記ファイル削除ロジックを走らせる。 この方法で一日一回のみ dir内全ファイル検索&対象削除 のロジックを走らせる方法で落ち着きました。