17

Log4jはクラスパス内の複数のlog4j.propertiesをどのように管理しますか?どのlog4j.propertiesファイルが優先されますか?正確なシナリオを説明しましょう。

異なるチームによって開発された複数のMavenモジュールがあり、それぞれに独自のlog4j.propertiesファイルがあります。これらのすべてのlog4j.propertiesファイルには、ConsoleAppenderおよびFileAppendersとともにRootLoggerが構成されています。

さて、Log4jがどのlog4j.propertiesファイルをロードするとき、RootLogger設定を構成するために使用しますか?また、Log4jはどのようにロガー階層を作成しますか?他のサードパーティjarのlog4j.propertiesファイルはロギングプロセスにどのように影響しますか?

4

2 に答える 2

16

クラスパスの最初のファイルがロードされます。したがって、A.jarとB.jarの両方にファイルが含まれていて、クラスパスでA.jarがB.jarの前にある場合、A.jarのファイルがロードされます。これがクラスローダーの動作です。

于 2012-06-10T07:07:18.587 に答える
6

log4j ver 1.x:

他の人が述べているように、log4jはクラスパスの最初の構成ファイルを探します。参照: http: //logging.apache.org/log4j/1.2/manual.html

ただし、クラスパスに「log4j.xml」ファイルと「log4j.properties」ファイルの両方がある場合、実験から、log4jは「log4j.properties」よりも「log4j.xml」を優先するようです。

つまり、最初に、log4jはクラスパスで最初の「log4j.xml」ファイルを探しているようです。存在しない場合、log4jはクラスパスで最初の「log4j.properties」ファイルを探すようです。

以下のコードからコピーして貼り付けると、使用されている構成ファイルを判別するのに役立つ場合があります。

import org.apache.log4j.Logger;

public class TestLog4j
{

  static
  {
    System.out.println("Classpath: [" + System.getProperty( "java.class.path" ) + "]" );
    System.out.println("Found logging configuration files:");
    System.out.println("  log4j.xml: " + Logger.getRootLogger().getClass().getResource( "/log4j.xml" ) );
    System.out.println("  log4j.properties: " + Logger.getRootLogger().getClass().getResource( "/log4j.properties" ) );
  }

  public static void main(String[] args)
  {
    System.out.println("main():");
  }
}

編集:

log4j ver 2.x:

デフォルトの構成ファイルの検索順序は、次の場所に記載されています:http: //logging.apache.org/log4j/2.x/manual/configuration.html

つまり、log4jバージョン2.xの場合、優先順位の高い構成ファイルが見つからない場合(log4j2-test。[properties | yaml | json | xml]など)、クラスパスで見つかった場合はファイルlog4j2.propertiesが使用されます。log4j2.xmlの優先順位が最も低く、log4j2の「プロパティ」、「yaml」、または「json」構成ファイルがすべて見つからない場合にのみ使用されることに注意してください。

注: log4j構成の問題のデバッグを支援するには、「log4j.debug」プロパティを次のように設定します。

java -Dlog4j.debug ... 

参照: log4jを正しく初期化する方法は?

于 2014-10-15T20:24:53.727 に答える