2017-11-07 15 views
1

私はlog4j v2.7を利用してJavaアプリケーションを構築しようとしてきました。私はユーザーがlog4jを設定できるように、プログラムで設定しようとしているコマンドライン引数をいくつか持っています。セットアップlog4j2ファイルappender programatically

は、ここで(ほとんどのlog4jドキュメントからコピー)機能、予想通り

public static void configureLogging(String path) { 
    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); 
    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout").addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"); 

    builder.setStatusLevel(Level.ALL); 
    builder.setConfigurationName("BuilderTest"); 
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE") 
      .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); 
    appenderBuilder.add(layoutBuilder); 

    builder.add(appenderBuilder); 
    builder.add(builder.newLogger("Console", Level.ALL).add(builder.newAppenderRef("Stdout"))); 

    appenderBuilder = builder.newAppender("file_log", "File") 
     .addAttribute("fileName", path) 
     .addAttribute("append", false) 
     .add(layoutBuilder); 
    builder.add(appenderBuilder); 

    builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("Stdout"))); 
    builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("file_log"))); 

    Configurator.initialize(builder.build()); 
} 

だから、コンソール出力です。空のログファイルが作成されますが、ファイルには何も出力されません。

私は、stackoverflowの投稿とlog4jのドキュメントのトンをサーフィンしました。何か案は?

+0

あなたはその[log4j2を知っていますか設定ファイルに変更があった場合、自動的に自分自身を再設定できます](https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration)?構成ファイルを外部化すると、コードがlog4j2の実装の詳細に依存しないため、長期的に管理しやすくなります。 –

答えて

1

私はこの問題は、あなたは下の行に2回RootLoggerインスタンスを作成しているということだと思う -

builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("Stdout"))); 
builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("file_log"))); 

2上記の行の代わりに、線の下に試してみてください -

builder.add(builder.newRootLogger(Level.ALL).add(builder.newAppenderRef("Stdout")).add(builder.newAppenderRef("file_log"))); 
関連する問題