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回ログに記録された情報があれば、その原因を特定するのに役立ちます。
両方のアペンダーが構成されている可能性があるため、ルートロガーによって1回、特定のロガーによってメッセージがログに記録されているように見えます(プロパティファイル内とコード内の異なる場所にある場合があります)。
これは、ロガーでadditivityをfalseに設定することで解決できます。 Log4j manual Appenders and Layoutセクションで加法性について言及しています。
アトランティスに同意します。
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
XML形式を使用する場合:
<logger name="package.class" additivity="false">
<level value="info" />
<appender-ref ref="file" />
<appender-ref ref="console" />
</logger>
注:デフォルトでは、ロガーの加算フラグはtrueに設定されています。
単に追加するだけです
logger.setadditivity(false);
あなたのコードに( 参照 )。
コンソールで結果が2倍になっています。これは、アペンダーがシングルトンではなく加算的であるためです。つまり、カテゴリはその祖先からすべてのアペンダーを継承します(デフォルト)。カテゴリにアペンダーを追加し、他のアペンダーと同じ基本ストリーム(コンソール、同じファイルなど)に書き込む場合、同じログメッセージがログに2回(またはそれ以上)表示されます。さらに、階層内の2つのカテゴリが同じアペンダー名を使用するように構成されている場合、Log4jはそのアペンダーに2回書き込みます。そのカテゴリ用に構成
Javaデバッガでプログラムを実行できる場合、これらの二重ロギング呼び出しの1つが発生するプログラムにブレークポイントを配置します。
デバッガーでロガーオブジェクトを調べます。 org.Apache.log4j.Logger(v 1.2.x)の場合、AppenderAttachableImplが含まれている可能性があります。 AppenderAttachableImplにアペンダーリストを照会できます。
複数のアペンダーを見つけた場合、これが問題である可能性があります-そしてそれを修正する手がかりです。
私も同じ問題を抱えていましたが、ルートロガーからすべてのアペンダーを削除することで修正しました。理由はわかりませんが、私の問題を解決し、共有しています:
// Root
rootLogger = Logger.getRootLogger();
rootLogger.removeAllAppenders(); // Solve my problem
// CSV
csvLogger = rootLogger.getLogger("csvLogger");
// Txt
txtLogger = rootLogger.getLogger("txtLogger");
この追加行がないと、csvLoggerまたはtxtLoggerでログを記録するたびに、加算性をfalseに設定することも2回記録されます。
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アペンダーが削除された場合でも、これらは現在、加法性のために上記の設定例にあります。ただし、コンソールアペンダーも追加の調整なしでルートロガーから削除された場合、要件は満たされなくなります。
resources/log4.properties
ファイル内。
その構成ファイルに「log4j.rootLogger= DEBUG, file
」がある場合は、「log4j.logger.org.springframework=DEBUG, file
」を含めないでください。 log4j.rootLogger部分のみを保持します。