2013-12-13 9 views
6

File appenderをプログラムで設定する必要があります。LOG4J2 - ファイルアペンダーをプログラムで作成するにはどうすればいいですか?

に私のアペンダーを設定したいlog4j2.xml(実行時にこれらのアペンダーのいずれかにプログラムで書き込む)。

<Configuration status="WARN"> 
<Appenders> 
    <File name="File_1" fileName="c:/FILE_1.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
    <File name="File_2" fileName="c:/FILE_2.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
    <File name="File_3" fileName="c:/FILE_3.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
</Appenders> 
<Loggers> 
    <Root level="debug"> 
     <AppenderRef ref="File_1"/> 
     <AppenderRef ref="File_2"/> 
     <AppenderRef ref="File_3"/> 
    </Root> 
</Loggers> 

例:彼らは、実行時にプログラムでアペンダを追加する方法について説明し、インターネットで様々なチュートリアルで探し

 if(condition.equals("A")){ 
      //write log on File_1 
     }else if(condition.equals("B")){ 
       //write log on File_2 
     }else { 
       //write log on File_3 
     } 

。実行時にxml構成ファイルで定義されているアペンダーの1つのみを に選択する方法はありますか?

最初のソリューション:

私は次のように問題を解決しようとしたが、log4j2.xmlで定義されたファイルは、プログラムと削除されていないので、私は私の解決策によって、満足していません最初のアペンダーは決して削除されません!私はlog4j2にバグがあると思う:https://issues.apache.org/jira/browse/LOG4J2-135私はlog4j2チームに問題を報告し

static org.apache.logging.log4j.core.Logger coreLogger =  
(org.apache.logging.log4j.core.Logger)LogManager.getLogger(MyClass.class.getName()); 
static LoggerContext context = (LoggerContext)coreLogger.getContext(); 
static BaseConfiguration configuration = (BaseConfiguration)context.getConfiguration(); 

static String FILE_1 = "File_1"; 
static String FILE_2 = "File_2"; 
static String FILE_3 = "File_3"; 

private static Map<String, Boolean> appendersMap; 
static 
{ 
    appendersMap = new HashMap<String, Boolean>(); 
    appendersMap.put(FILE_1, true); 
    appendersMap.put(FILE_2, true); 
    appendersMap.put(FILE_3, true); 
} 

/** 
* Configure appenders. 
* 
* @param appender the appender 
*/ 
public static void configureAppenders(String appender){ 

    if(appender.equals(FILE_1)){ 
     addAppenders(FILE_1); 
     removeAppenders(FILE_2,FILE_3); 
    } 

    else if(appender.equals(FILE_3)){ 
     addAppenders(FILE_3); 
     removeAppenders(FILE_1,FILE_2); 
    } 

    else if(appender.equals(FILE_2)){ 
     addAppenders(FILE_2); 
     removeAppenders(FILE_1,FILE_3); 
    } 

} 

private static void addAppenders(String appender){ 
    if (!appendersMap.get(appender)){ 
     appendersMap.put(appender, true); 
     coreLogger.addAppender(configuration.getAppender(appender)); 
    } 
} 

private static void removeAppenders(String... appenders){ 
    for(String appender : appenders){ 
     appendersMap.put(appender, false); 
     coreLogger.removeAppender(configuration.getAppender(appender)); 
    } 
} 
+1

シスコ、あなたのコードは私をとても助けました。あなたのコードを見たときまで私はアペンダーを付けることができませんでした。 –

答えて

1

この質問を頼まれた、とのLog4j 2.4のとおりLog4jの2のためのより良いプログラム的な構成をサポートする要求の数があったので、それはしばらくして、APIをするのlog4j-コアに加えています容易にprogrammatic configuration

新しいConfigurationBuilder APIを使用すると、ユーザーはコンポーネントの定義を作成できます。このAPIを使用すると、実際の設定オブジェクト(LoggerConfigやFileAppenderなど)で直接作業する必要はなく、Log4jがどのように動作するかについて多くの知識が必要です。コンポーネント定義がConfigurationBuilderに追加され、すべての定義が収集されると、(LoggerとAppendersのような)実際の設定オブジェクトがすべて構築されます。 Javaコードを記述している点を除いて、XML構成構文のような感じです。新しいConfigurationBuilder APIがにユーザーコードが新しいコンフィギュレーションを作成したり、完全に既存の設定を置き換えることができますことを

注意。ユースケースが異なり、プログラム的にしたい場合Log4jの起動後に既存の設定をに変更するのではなく、実際の設定オブジェクトで作業する必要があります。その場合は、マニュアルのProgrammatically Modifying the Current Configuration after Initializationセクションを参照してください。

あなたが内部の設定オブジェクトを直接操作する必要性を行う場合は、変更内容を有効にするには終わりLoggerContext.updateLoggers()またはConfigurator.initialize(Configuration)のいずれかを呼び出す必要がありますのでご注意ください。例:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
final Configuration config = ctx.getConfiguration(); 
... // make changes 
ctx.updateLoggers(); // NECESSARY! 
0

これは私のために働いています。方法はわかりません。私はロガーを更新しておらず、コンテキストを再設定していません。

Logger coreLogger = (Logger)LogManager.getLogger(LoggingStuff.class.getName()); 
    Layout layout = ((LoggerContext)LogManager.getContext()).getConfiguration().getAppender("Console").getLayout(); 
    Appender appender = FileAppender.newBuilder().withName("File").withFileName("target/bash.log").withLayout(layout).build(); 
    appender.start(); 
    coreLogger.addAppender(appender); 
+0

わからない、どうすれば答えとして投稿できますか? – Billa

+0

さて、それは仕事をしています。しかし、どのようにこの作品が役に立つのかについての説明はありません。 – Ash

関連する問題