2012-03-29 18 views
0

私は、次のlog4j.propertiesファイルがあります:私のJavaプログラムでlog4jがstdoutに出力されるのはなぜですか?

log4j.rootLogger=DEBUG,A1,A2,A3 

log4j.appender.A1=org.apache.log4j.RollingFileAppender 
log4j.appender.A1.Threshold=DEBUG 
log4j.appender.A1.File=log.out 
log4j.appender.A1.MaxFileSize=100KB 
log4j.appender.A1.MaxBackupIndex=1 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%p %d %t %c - %m%n 

log4j.appender.A2=org.apache.log4j.RollingFileAppender 
log4j.appender.A2.Threshold=WARN 
log4j.appender.A2.File=warnings.out 
log4j.appender.A2.MaxFileSize=100KB 
log4j.appender.A2.MaxBackupIndex=1 
log4j.appender.A2.layout=org.apache.log4j.PatternLayout 
log4j.appender.A2.layout.ConversionPattern=%p %d %t %c - %m%n 

log4j.appender.A3=org.apache.log4j.RollingFileAppender 
log4j.appender.A3.Threshold=ERROR 
log4j.appender.A3.File=errors.out 
log4j.appender.A3.MaxFileSize=100KB 
log4j.appender.A3.MaxBackupIndex=1 
log4j.appender.A3.layout=org.apache.log4j.PatternLayout 
log4j.appender.A3.layout.ConversionPattern=%p %d %t %c - %m%n 

を、私は定義された次の変数があります:私はロガーのメソッドを呼び出すとき

private Logger logger = Logger.getRootLogger(); 

static { 
    URL url = MyClass.class.getClassLoader().getResource("/log4j.properties"); 

    if (url == null) { 
     // log4j.properties not found in CLASSPATH, revert to console output 
     BasicConfigurator.configure(); 
    } 
    else { 
     // log4j.properties found 
     PropertyConfigurator.configure(url); 
    } 
} 

をなぜそれが出力も、あります3つの出力ファイルに加えて、コンソール(stdout)に行きますか?

+2

stdoutではなくstdoutになると確信していますか?後者は説明しやすくなります。 – ruakh

+1

どのようにlog4jファイルをパッケージ化していますか? JVMを起動するときに '-Dlog4j.configuration'が正しいファイルに設定されていますか? – CoolBeans

+0

@ruakhそれはstderrに行く可能性があります...それはコンソールに行くとどちらかの理由はわかりません... –

答えて

1

ファイル名をlog4j.propertiesにしてクラスパスのルートに入れる場合は、デフォルトで選択されるため、BasicConfiguratorに渡す必要はありません。おそらく、あなたのケースで何が起こっている

は、Javaのクラスローダは、パラメータなしBasicConfigurator.configure()へのお電話は、log4jのデフォルト設定を使用するようになっている(ルートに)存在したファイルを見つけていないことです。

確認log4j.propertiesを作るには、すなわち、WARファイルのクラスパスのルートです。:

WEB-INF\classes\log4j.properties

0

私は全体の静的なブロックを削除することで問題を解決するために管理しました。いくつかの奇妙な理由で、BasicConfigurator.configure()は呼び出されているようです...(他の3つのファイルも生成されていますが)

+0

IMHO、クラスローダーとそのクラスパスは、J2EE環境で予測するのが最も難しいものです。試行錯誤が必要です。 Log4jが設定ファイルを見つけて読み込んだのでファイルが作成されていたと思いますが、コードがそれをオーバーロードして空の設定をロードしました。また、IMHO、コード内のコンフィギュレータを呼び出さずに、log4jにデフォルトの場所でファイルを見つけさせ、そのことをさせるのが最善です。 – theglauber

関連する問題