※ ChatGPTを利用し、要約された質問です(原文:Javaでlog4jを使ってログを出力させてます。)
Javaでlog4jを使ってログを出力する際に、ログローテーションでエラーが発生する理由を教えてください
このQ&Aのポイント
Javaでlog4jを使用して複数のログを出力する際に、同一propertiesに複数のAppenderを定義する方法を使用しています。
ログの出力先(ファイル)は、プロセスごとに異なる設定をしています。
ログローテーション時に「log4j:ERROR Failed to rename」のエラーが発生し、ローテーションが正常に行われません。ログローテーション時に他のプロセスで出力するファイルをロックしてしまっている可能性があります。
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に書いているのが悪いんでしょうか?
それとも、設定が不足している為、そうなってしまってるんでしょうか?
ご存知の方、お知恵をお貸し下さい。
お礼
情報ありがとうございました。 同一propertiesに設定を纏めたい場合、 プロセス毎にシステムプロパティを介して設定すれば出来るとの事でしたが、 当該プロセス以外のファイルは、0kbのファイルが意図しないフォルダに作成されたり、 今まで通りリネームエラーが発生したりでうまくいきませんでした。 (単に私のやり方が悪かったせいかもしれませんが) 今のところ、 1つのプロセス毎に1つのpropertiesを設定するしかないのかなーと思っています。