55095


一つのアプリケーション内で使用する以下のようなXMLを作成したところ、  
複数のappenderに同じファイルを指定してはいけないとか、  
ローテートに失敗したりローテートしたファイルが消滅したりすると聞きました。

異なるサーバ上に配備されたアプリケーションが同一ファイルに対してログを書き込もうとした場合や、  
appenderの定義に矛盾がある場合にはあり得るとは思うのですが、  
一つのアプリケーション内で複数のappenderが同一条件で一つのファイルに対し書き込みした場合に  
指摘されたような現象が発生するのでしょうか。  
もし見当違いの質問でしたら大変申し訳ございません。  
どなたかご教授くださいますようお願いいたします。

[code]

    <appender name="xxx" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="/abc/a.log" />
        <param name="threshold" value="debug" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">省略</layout>
    </appender>
    <appender name="yyy" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="/abc/a.log" />
        <param name="threshold" value="debug" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">省略</layout>
    </appender>
    <category name="sample.test.xxx">
        <priority value="debug" />
        <appender-ref ref="xxx"/>
    </category>
    <category name="sample.test.yyy">
        <priority value="debug" />
        <appender-ref ref="yyy"/>
    </category>
    
[/code]


CC BY-SA 4.0
2019-05-19T07:42:49.340
55088
2019-05-20T13:14:21.743
question
logging
log4j.xmlで複数のappender要素のfileオプションに同一パスを指定することの是非について


Log4j（Log4jバージョン1.x）には、同じJVM内であっても複数のappenderが同期をとって書き込みを行うような仕組みがないようです。ただし、[ここ](https://logging.apache.org/log4j/1.2/faq.html#a3.3)にあるように、`SocketAppender`を使って、（ローカルの）Log4jサーバーに対してログを出力するような方式にしたら、1ファイルに出力できます。もちろん性能は落ちますが。

Log4jの後継であるLog4j
2であれば、`locking`というパラメーターとともに`FileAppender`ででそれが可能なようです（複数のJVMや複数のホストであってもいいとのこと）。

<https://logging.apache.org/log4j/2.x/manual/appenders.html>

ただし、このパラメーターは`FileAppender`では設定可能ですが、`RollingFileAppender`ではサポートされていないので、ローテーションと同時には使用できません。

> File locking is not supported by the RollingFileAppender.

それから、おそらく、Log4jではなく、Logbackなどを使用すれば実現できるのではないかと思います。

まとめると、使用するソフトウェアやバージョン、appenderの種類によって実現の可否が変わります。古いバージョンでは、アーキテクチャー上の問題やバグなどで、正常に動作しないこと（書き込みが重なったり、ファイルが破損したり）があります。また、性能面に大きな影響を与える可能性があります。逆に、負荷が少なければ、実害ができない可能性もあります。公式のガイドをよく読むことと十分な負荷試験をしてみることが重要かなぁと思います。

[参考]

  * [Stack Overflow - Can two log4j fileappenders write to the same  
file?](https://stackoverflow.com/questions/1253586/can-two-
log4j-fileappenders-write-to-the-same-file)

  * [Stack Overflow - Log4j - Have multiple appenders write to the same file with one that always logs](https://stackoverflow.com/questions/4046825/log4j-have-multiple-appenders-write-to-the-same-file-with-one-that-always-logs)


CC BY-SA 4.0
2019-05-19T19:29:28.130
55095
2019-05-20T13:14:21.743
2019-05-20T13:14:21.743
21092
21092
55088
answer