2009-08-07 11 views
9

になっていないにもかかわらず、stdoutにログ出力を指示しますファイル。各クラスの私のコードでlog4jは、すべてのそれは私が持っている私のlog4j.propertiesで

は、私は設定のいずれかのいずれか:私はものはコンソールに行く必要はありません

static Logger log = Logger.getLogger("notRootLogger); 

^。

-OR-

static Logger log = Logger.getRootLogger(); 

^私が行うと。

notRootLoggerがstdoutになるように書かれたものを停止するには、log4.propertiesで何をしなければなりませんか?ルートロガーがどこに行くのに書き込むかは、何らかの理由でオフにする必要がある場合、何らかの継承がありますか?

コンソールにログするだけの個々のクラスごとにロガーを設定する必要はありません。

答えて

23

、IIRCを設定する必要があります。 log4j manualから:

与えられたロガーの各有効ロギングの要求は 階層の上位のアペンダとして 同様にそのロガーですべての アペンダに転送されます。つまり、アペンダー は、 ロガー階層から追加されて継承されます。たとえば、 コンソールアペンダーがルート ロガーに追加されている場合、有効なすべてのロギング 要求は、少なくとも コンソールに出力されます。さらにファイル アペンダーがロガーに追加された場合、Cの が有効になり、C のロギング要求が有効になり、Cの子はファイル とコンソールに出力されます。 フラグをfalseに設定すると、 アペンダーのアキュムレーションがもはや アダーでなくなるように、このデフォルトの動作をオーバーライドすることが可能です( )。

これを試してみてください:

log4j.rootLogger=DEBUG,stdout 
log4j.logger.notRootLogger=DEBUG,somewhereelse 
log4j.additivity.notRootLogger=false 
0

うーん、それは階層の上位ロガーからアペンダを継承するため、より慎重に

log4j.additivity.notRootLogger=false 

修正にそれをLog4jのために短いイントロを読んだことがあるはずです ルートロガーは明らかに階層の最上位にあります。

+0

これは最適化とは何ですか? – skaffman

+3

どのように「時期尚早最適化」ですか?それはまったく「最適化」ではありません。デフォルトとは異なるオプションが必要になります。デフォルトでadditivityがfalseであった場合、それは他の多くの人が明示的にtrueに設定する必要があることを意味します。私はより多くの人々が「偽」よりも「真実」を望んでいると思う。 –

+0

あなたがlog4jイントロのドキュメントを読んだり、それを使った –

0

Javaクラスでloggerのプロパティが定義されている場合は、最終的にlogger.shutdown()メソッドを呼び出して、最終的にloggerの追加性を禁止することができます。

関連する問題