0

クラスター環境で実行されているWebアプリケーションにlog4jを使用しています。いくつかの状況では、一部のプロセス(特にない)のロギングが失われます。理由を特定することはできません。単一のサーバーインスタンスで実行すると、正常に機能します。私は毎日ローリングファイルアペンダーを使用しています。追加/変更する追加の属性はありますか?Async Appenderは役に立ちますか?これに関する解決策はありますか?

編集:以下は私が使用することを計画しているAsyncAppenderと一緒にlog4jXMLです

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
    <appender name="appLog" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/logs/app.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Threshold" value="DEBUG" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p (%F:%L) - %m%n" />
        </layout>
    </appender>

    <appender name="async" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="256" />
        <param name="LocationInfo" value="true"/> 
        <appender-ref ref="appLog" />
    </appender>

    <root>
        <priority value="debug" />
        <appender-ref ref="async" />
    </root>
</log4j:configuration>
4

2 に答える 2

1

Log4J構成とクラスタートポロジに関するいくつかの情報を添付しないと、確実に知ることはできませんが、Log4Jの構成方法とアプリケーションの方法に不一致がある場合、あなたが説明していることは非常によく起こる可能性がありますクラスタで実行するように構成されています。

たとえば、両方のクラスター メンバーが同じ物理マシンで実行され、アプリケーションが両方のインスタンスでまったく同じ Log4J 構成ファイルを使用している場合、事実上、2 つの異なる JVM が同じファイルに同時にログインすることになります。それではうまくいきません。

一般に、2 つの異なるクラスローダが同じ物理ファイルに書き込む状況は避ける必要があります。

更新(添付ファイルに続くlog4j.xml): クラスター化されたサーバーが同じ物理マシンで実行されていると仮定すると、接続した構成は、複数の log4j 構成が同じ物理ファイルにログインすることになります (log4j はクラスローダーのコンテキストで「存続」し、複数のサーバーがあるため、同じ物理マシン上に複数のクラスローダーがあります)。2 つの log4j「インスタンス」には、そのファイルへの書き込みを同期する方法がないため、これは機能しません。

アンAsyncAppenderはあなたを助けるつもりはありません。AsyncAppenderログ要求をバッファリングして、ログ行が実際に書き込まれる前にプログラムが制御できるようにするだけですまったく同じファイルへの書き込みを同期するという問題は解決しません。

それを解決するには、次の 2 つの方法があります。

  1. 各 JVM が異なるログ ファイルにログインするようにします。実際に試してみて、それが機能することを確認してください。
  2. SocketAppender代わりにaを使用してください。すべてのログ (すべてのサーバー インスタンスから) は最終的にネットワーク接続を介して送信され、サーバー プログラム (log4j によって提供される) がログを収集してファイルに書き込みます。使用方法の説明はこちらにあります
于 2012-12-16T14:39:16.933 に答える
1

2 つの異なるクラスローダー/jvm が同じ物理ログ ファイルに書き込む状況を回避するためのIsaacの提案によると、次のようになります。

それを解決するには、次の 2 つの方法があります。

  1. 各 JVM が異なるログ ファイルにログインするようにします。実際に試してみて、それが機能することを確認してください

  2. 代わりに SocketAppender を使用してください。すべてのログ (すべてのサーバー インスタンスから) はネットワーク接続を介して送信され、サーバー プログラム (log4j によって提供される) がログを収集してファイルに書き込みます。使用方法の説明はこちらにあります。

ポイント#1については、以下のアプローチが機能します。

使用する:

<param name="File" value="${sys:log4j.logFile}" />

その代わり:

 <param name="File" value="/logs/app.log" />

JVM1 の場合、JVM プロパティを設定します: log4j.logFile=/logs/ jvm1 /app.log

JVM2 の場合、JVM プロパティを設定します: log4j.logFile=/logs/ jvm2 /app.log

詳細およびその他のオプションについては、次を参照してください: link1link2

于 2013-02-15T07:34:21.497 に答える