web-dev-qa-db-ja.com

log4jロギング2回

Log4jを使用して、エラーやその他のシステム情報を記録しています。しかし、INFOレベルで2回ログに記録された情報が含まれています。

public static void main(final String... args) throws Exception {

    LOGGER.info("program started");
    try {
        // try body codes
    } catch (Exception ex) {
        LOGGER.info("program start-up failed.",ex);
    }
}

ただし、プログラムが開始または失敗した場合、2回ログに記録された情報があれば、その原因を特定するのに役立ちます。

64

両方のアペンダーが構成されている可能性があるため、ルートロガーによって1回、特定のロガーによってメッセージがログに記録されているように見えます(プロパティファイル内とコード内の異なる場所にある場合があります)。

これは、ロガーでadditivityをfalseに設定することで解決できます。 Log4j manual Appenders and Layoutセクションで加法性について言及しています。

92
atlantis

アトランティスに同意します。

log4j.rootCategory=INFO, console
log4j.logger.org.hibernate=INFO

上記のプロパティ設定により、二重のログが記録されます。

ただし、追加

log4j.additivity.org.hibernate=false

問題を修正しました。

この本の62ページをご覧ください。 http://books.google.com/books?id=hZBimlxiyAcCprintsec=frontcover#v=onepageqf=false

33
Gervase

XML形式を使用する場合:

<logger name="package.class" additivity="false">
    <level value="info" />
    <appender-ref ref="file" />
    <appender-ref ref="console" />
</logger>

注:デフォルトでは、ロガーの加算フラグはtrueに設定されています。

30
Lee Chee Kiam

単に追加するだけです

logger.setadditivity(false);

あなたのコードに( 参照 )。

コンソールで結果が2倍になっています。これは、アペンダーがシングルトンではなく加算的であるためです。つまり、カテゴリはその祖先からすべてのアペンダーを継承します(デフォルト)。カテゴリにアペンダーを追加し、他のアペンダーと同じ基本ストリーム(コンソール、同じファイルなど)に書き込む場合、同じログメッセージがログに2回(またはそれ以上)表示されます。さらに、階層内の2つのカテゴリが同じアペンダー名を使用するように構成されている場合、Log4jはそのアペンダーに2回書き込みます。そのカテゴリ用に構成

4
AugustRush

Javaデバッガでプログラムを実行できる場合、これらの二重ロギング呼び出しの1つが発生するプログラムにブレークポイントを配置します。

デバッガーでロガーオブジェクトを調べます。 org.Apache.log4j.Logger(v 1.2.x)の場合、AppenderAttachableImplが含まれている可能性があります。 AppenderAttachableImplにアペンダーリストを照会できます。

複数のアペンダーを見つけた場合、これが問題である可能性があります-そしてそれを修正する手がかりです。

2
Tim T

私も同じ問題を抱えていましたが、ルートロガーからすべてのアペンダーを削除することで修正しました。理由はわかりませんが、私の問題を解決し、共有しています:

        // Root
    rootLogger = Logger.getRootLogger();
    rootLogger.removeAllAppenders(); // Solve my problem
        // CSV
    csvLogger = rootLogger.getLogger("csvLogger");
        // Txt
    txtLogger = rootLogger.getLogger("txtLogger");

この追加行がないと、csvLoggerまたはtxtLoggerでログを記録するたびに、加算性をfalseに設定することも2回記録されます。

0
Fernando Rezk

additivityプロパティを調整する可能性のある代替方法は、ロガーを最も具体的なものから最も一般的なものまで調べることです。次の例では、foo.bar.LoggingExampleClassで発生するすべてのログイベントについて、コンソールに二重のログが記録されることが予想されます。ルートロガーですでにカバーされているため、foo.bar.LoggingExampleClassロガーから余分なコンソールアペンダーを削除しても安全です。

<Logger name="foo.bar.LoggingExampleClass" level="DEBUG">
  <AppenderRef ref="Console" />   <!-- THIS APPENDER COULD BE REMOVED -->
  <AppenderRef ref="FooBarPackageLogging" />
</Logger>

<Root level="WARN">
  <AppenderRef ref="Console" />
  <AppenderRef ref="MainLogFile" />
</Root>

加算性調整アプローチとアペンダー調整アプローチの両方にはトレードオフがあります。加算性をオフにすると、望ましいジェネリックレベルロガーのアペンダーの使用が意図せずに停止する場合があります。上記の例では、foo.bar.LoggingExampleClass Loggerのadditivity="false"プロパティを設定すると、ルートロガーで参照されるMainLogFileにロギングイベントが追加されなくなります。

一方、より詳細なロガーへの影響を調査せずに親アペンダーを変更すると、親アペンダーに依存することが問題になる場合があります。たとえば、foo.bar.LoggingExampleClassロギングイベントをコンソールに書き込む必要があるとします。 foo.bar.LoggingExampleClass LoggerのConsoleアペンダーが削除された場合でも、これらは現在、加法性のために上記の設定例にあります。ただし、コンソールアペンダーも追加の調整なしでルートロガーから削除された場合、要件は満たされなくなります。

0
GoldDragonTSU

resources/log4.propertiesファイル内。

その構成ファイルに「log4j.rootLogger= DEBUG, file」がある場合は、「log4j.logger.org.springframework=DEBUG, file」を含めないでください。 log4j.rootLogger部分のみを保持します。

0
Gene