1

私はlog4jを初めて使用していますが、これを理解できないようです。log4j.configuration を存在しないガベージ ファイルに設定すると、次のプログラムは期待どおりに動作します。しかし、そうしないと、サイレントになります(プロパティを出力する以外):

package com.example.test;

import org.apache.log4j.*;

public class Log4jExample2 {
    final static Logger logger = Logger.getLogger("test.Log4jExample2");    

    static void kvshow(String[] karray)
    {
        for (String k : karray)
        {
            String v = System.getProperty(k);
            System.out.println(k+"="+v);
        }
    }

    public static void main(String[] args) {
        kvshow(new String[] {"log4j.configuration", "log4j.properties"});
        BasicConfigurator.configure();
        logger.debug("Hello world.");
    }

}

実行時セッションは次のとおりです。

>java -cp test-20090219.jar com.example.test.Log4jExample2
log4j.configuration=null
log4j.properties=null

>java -cp test-20090219.jar -Dlog4j.configuration=blah.cfg com.example.test.Log4jExample2
log4j.configuration=blah.cfg
log4j.properties=null
0 [main] DEBUG test.Log4jExample2  - Hello world.

私は困惑しています。(繰り返しますが、blah.cfg というファイルはありません。これが私が作業を行うための最も簡単な方法でした) log4j はどこから指示を取得していますか?

4

3 に答える 3

1

うーん、私には手がかりがあります... log4jマニュアルを調べていて、ランダムにこれを試しました:

>java -Dlog4j.debug=true com.example.test.Log4jExample2
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$ExtClassLoader@35ce36 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Using URL [jar:file:/C:/appl/Java/jre6u10/lib/ext/bsf.jar!/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/C:/appl/Java/jre6u10/lib/ext/bsf.jar!/log4j.properties
log4j: Parsing for [root] with value=[FATAL, CONSOLE].
log4j: Level token is [FATAL].
log4j: Category root set to FATAL
log4j: Parsing appender named "CONSOLE".
log4j: Parsing layout options for "CONSOLE".
log4j: End of parsing for "CONSOLE".
log4j: Parsed "CONSOLE" options.
log4j: Finished configuring.
log4j.configuration=null
log4j.properties=null

Bean スクリプト フレームワークが私をオーバーライドしているようです。

どうすればこれを止めることができますか? 私が望むのは、JRE がプロパティ ファイルで明示的に呼び出されない場合、.jar ファイルに含まれる設定を使用することです。独自の log4j.properties ファイルを .jar ファイルのルートに配置しようとしましたが、うまくいかないようです。

編集:ああ!私はそれを理解したと思います: Logger.getLogger() を最初に使用する前に System.setProperty を実行する必要があります。

static
{
    System.setProperty("log4j.configuration",
    "jar:file:my_jar_file_name_here.jar!/log4j.properties");        
}
于 2009-02-19T22:55:07.120 に答える
0

「ロガー用のアペンダーが見つかりませんでした」というエラーを単に抑制したい場合は、srcフォルダーに新しいファイルを作成し、 log4j.propertiesという名前で入力します。

  #Set root logger level to DEBUG and its only appender to A1.
  log4j.rootLogger=WARN, A1
  #A1 is set to be a ConsoleAppender.
  log4j.appender.A1=org.apache.log4j.ConsoleAppender
  #A1 uses PatternLayout.
  log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

次に、保存します。

これは単に前述のエラーを抑制することに注意してください。

于 2013-07-25T17:49:16.423 に答える
0

BasicConfiguratorは Log4Jのデフォルト値を設定します。したがって、BasicConfigurator を使用する場合、構成ファイルからの読み取りはありません。プロパティ ファイルから構成するには、PropertiesConfiguratorを使用します。

于 2009-02-19T22:52:20.717 に答える