2016-03-04 2 views
1

У меня возникла проблема с настройкой log4j2 с Java.Проблема с log4j Конфигурация Java

У меня есть рабочий XML-конфигурация:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="DEBUG"> 
<appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n" /> 
    </Console> 
    <File name="DM_PREPUB" fileName="logs/41_2015/DM_PREPUB.log"> 
     <MarkerFilter marker="DM_PREPUB" onMatch="ACCEPT" onMismatch="DENY" /> 
     <PatternLayout> 
      <pattern>%d %p %C{10} [%t] %m%n</pattern> 
     </PatternLayout> 
    </File> 
    <File name="BACKUP" fileName="logs/41_2015/BACKUP.log"> 
     <MarkerFilter marker="BACKUP" onMatch="ACCEPT" onMismatch="DENY" /> 
     <PatternLayout> 
      <pattern>%d %p %C{10} [%t] %m%n</pattern> 
     </PatternLayout> 
    </File> 
</appenders> 
<loggers> 
    <logger name="foo.bar" level="DEBUG"> 
     <appender-ref ref="DM_PREPUB" /> 
     <appender-ref ref="BACKUP" /> 
    </logger> 
    <root level="ALL"> 
     <appender-ref ref="Console" /> 
    </root> 
</loggers> 
</configuration> 

Как вы можете видеть, этот конфиг создает два FILE appenders с соответствующими маркерами. Совсем просто.

Я попробовал и реализовать ту же конфигурации в Java, но не повезло:

ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); 
    builder.setStatusLevel(org.apache.logging.log4j.Level.ALL); 
    builder.setConfigurationName("DMWorkflow"); 
    builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL).addAttribute("level", org.apache.logging.log4j.Level.DEBUG)); 
    // console appender 
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); 
    appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n")); 
    builder.add(appenderBuilder); 
    // main log appender 
    appenderBuilder = builder.newAppender("DM_PREPUB" /*appender name*/, "FILE" /*appender type*/) 
      .addAttribute("fileName", "logs/41_2015/DM_PREPUB.log"); 
    appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d %p %C{10} [%t] %m%n")); 
    appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.ACCEPT, Filter.Result.DENY).addAttribute("marker", "DM_PREPUB")); 
    builder.add(appenderBuilder); 
    // step appenders 
    appenderBuilder = builder.newAppender("BACKUP" /*appender name*/, "FILE" /*appender type*/) 
      .addAttribute("fileName", "logs/41_2015/BACKUP.log"); 
    appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "%d %p %C{10} [%t] %m%n")); 
    appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.ACCEPT, Filter.Result.DENY).addAttribute("marker", "BACKUP")); 
    builder.add(appenderBuilder); 
    // main logger 
    LoggerComponentBuilder componentBuilder = builder.newLogger("foo.bar", org.apache.logging.log4j.Level.DEBUG).add(builder.newAppenderRef("DM_PREPUB")); 
    // step loggers 
    componentBuilder.add(builder.newAppenderRef("BACKUP")); 
    builder.add(componentBuilder); 
    builder.add(builder.newRootLogger(org.apache.logging.log4j.Level.ALL).add(builder.newAppenderRef("Stdout"))); 
    Configurator.initialize(builder.build()); 

В обоих случаях я создаю экземпляр РЕГИСТРАТОРУ так:

logger = LogManager.getLogger("foo.bar"); 
    globalMarker = MarkerManager.getMarker("DM_PREPUB"); 

Код конфигурации Java не кажется, что это сложно, поэтому я не вижу, где я ошибся.

Если бы у вас была какая-либо помощь, это могло бы быть здорово.

Спасибо!

Erwann

+0

Я забыл указать, что во время выполнения файлы создаются в порядке! Но они остаются пустыми, как и консоль ... – Erwann

+0

вы можете использовать ссылку «изменить», чтобы добавить это к самому вопросу, а не к комментарию. –

+0

, и вы регистрируетесь с маркером в качестве аргумента? (например, logger.info (globalMarker, «ACCEPT 1») правильно? –

ответ

3

То, что сработало для меня, когда я боролся с такой же проблемой была инициализации регистратор с помощью:

((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)).start(builder.build()); 

Я не пробовал свой подход, то хотя. Моя проблема заключалась в том, что регистраторы ничего не писали, а при отладке я выяснил, что конфигурация, которую я предоставил с использованием builder, никогда не использовалась, поскольку Log4j2 почему-то решил, что она уже использует ту же конфигурацию и не нуждается в перенастройке.

Если вышеизложенное не помогает, попробуйте отладить, чтобы узнать, что происходит как в builder.build(), так и в Configurator.initialize(). Насколько я помню, мои проблемы были вызваны флагом AbstractLifeCycle.state, который должен был находиться в состоянии INITIALIZED, но вскоре стал STARTED.

+0

Я отлично справляюсь с этим решением! Я должен вам большой, за то, что вам не пришлось бороться так, как вы. Думаю, мне следовало подумать об отладке в первую очередь. – Erwann

+0

Работала для меня тоже. Не знаю, почему это сработало, когда я пытался выполнить пример перенастройки с Configurator.initialize() здесь: https://logging.apache.org/log4j/2.x/manual/customconfig.html it никогда не работал и всегда использовал конфигурацию по умолчанию независимо от того, как я настроил построитель. – QuestionableUser

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