2013-12-13 2 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 
     } 

Глядя на различные учебники в Интернете, они объясняют, как добавить appenders программно во время выполнения; есть способ выбрать во время выполнения только один из приложений, определенных в файле конфигурации xml?

ПЕРВОЕ РЕШЕНИЕ:

Я попытался решить эту проблему следующим образом, но я не удовлетворен моим решением, так как файлы, определенные в log4j2.xml не удаляются программно И первый Appender никогда не удаляется! Я думаю, что есть ошибка в log4j2: https://issues.apache.org/jira/browse/LOG4J2-135 (статус решена, но я не думаю, что так ... Я использую log4j-2.0-beta9)

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

Cisco, чувак, ваш код мне очень помог. Я не смог прикрепить свои приложения, пока не увидел ваш код. –

ответ

1

Это было некоторое время, так как этот вопрос был задан, и там было несколько запросов на поддержку более программной конфигурации для Log4j 2. По Log4j 2.4, API был добавлен в log4j-ядро к облегчить programmatic configuration.

Новый API ConfigurationBuilder позволяет пользователям создавать компоненты определения. С помощью этого API нет необходимости работать непосредственно с реальными объектами конфигурации (такими как LoggerConfig и FileAppender), которые требуют большого количества знаний о том, как Log4j работает под капотом. Определения компонентов добавляются в ConfigurationBuilder, и как только все определения будут собраны, будут созданы все фактические объекты конфигурации (такие как Loggers и Appenders). Он немного похож на синтаксис конфигурации XML, за исключением того, что вы пишете Java-код.

Обратите внимание, что новый 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

ну, это делает job.but любое объяснение того, как это работает, было бы полезно. – Ash

Смежные вопросы