2016-08-26 6 views
1

Да, я прочитал все связанные вопросы. Я использую log4j2 (испробовал как версию 2.4, так и обновление до версии 2.6.2).Log4j2 не меняет уровень ведения журнала во время выполнения

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

Вот мой код, чтобы включить ведение журнала отладки

private static void enableDebugLogs(){ 
    LoggerContext ctx = (LoggerContext) LogManager.getContext(); 
    LoggerConfig log = ctx.getConfiguration().getRootLogger(); 

    System.out.println(log.getLevel()); // INFO 

    log.setLevel(Level.DEBUG); 

    System.out.println(log.getLevel()); // DEBUG 

    ctx.updateLoggers(); 

    System.out.println(ctx.getRootLogger().getLevel()); // DEBUG, hey it works, right? 
} 

Но это не на самом деле работать с любым из этих случаев:

enableDebugLogs(); 
logger.debug("Debug mode on"); // static, already made logger. Level did not change 

LogManager.getLogger(Main.class).debug("Debug"); // Nope, not printing 

Logger root = LogManager.getRootLogger(); 
root.info("Level: " + root.getLevel()); // Level: INFO, should be DEBUG 

Полезность программа закончена, как правило, менее чем за 30 секунд, поэтому изменение должно быть мгновенным. Вот log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/> 
     </Console> 
     <RollingFile name="File" fileName="program_name.log" filePattern="program_name-archived.log"> 
      <PatternLayout> 
       <Pattern>%d{HH:mm:ss.SSS} %-5level - %msg%n</Pattern> 
      </PatternLayout> 
      <Policies> 
       <SizeBasedTriggeringPolicy size="10 KB" /> 
      </Policies> 
      <DefaultRolloverStrategy min="1" max="1"/> 
     </RollingFile> 
    </Appenders> 
    <Loggers> 
     <Root level="info"> 
      <AppenderRef ref="Console"/> 
      <AppenderRef ref="File"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Проблема с использованием приложений AppenderRefs? Могу ли я как-то сказать, что Appenders обновил уровень ведения журнала от Root logger?

ответ

1

Нашел настоящую проблему. Если бы использовать:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 

вместо

LoggerContext ctx = (LoggerContext) LogManager.getContext(); 

API с указанием разницы быть "возвращает LoggerContext" и "возвращает текущую LoggerContext". И я явно пропустил этот бит информации для версии без логического параметра:

«ПРЕДУПРЕЖДЕНИЕ. LoggerContext, возвращенный этим методом, может быть не LoggerContext, используемый для создания регистратора для вызывающего класса».

0

Чтобы перенастроить log4j2 после его инициализации, документация даст вам два способа:

  1. Используя конфигурационный файл, вы можете включить автоматическую перенастройку (это предпочтительный способ), так что изменение файла после инициализации будет отражается на вашей среды выполнения: http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration
  2. Использование ConfigurationBuilder вы можете перенастроить log4j программно (я думаю, что это то, что вы ищете), увидеть «Reconfigure log4j Использование ConfigurationBuilder с Configurator» абзац этой страницы: http://logging.apache.org/log4j/2.x/manual/customconfig.html
+0

Имейте в виду, что если вы используете оба (смотреть конфигурационный файл ** и ** программные изменения), то автоматическая реконфигурация может и сбросит ваши программные изменения. – Fildor

0

В дополнение к вышесказанному, чтобы отладить инициализацию log4j, установите в начале конфигурационного файла <Configuration status="trace". Журналы внутреннего журнала Log4j2 будут печататься на консоли. Это может помочь устранить неполадки.

0

Вы можете изменить конфигурацию ведения журнала между двумя или несколькими файлами log4j2.xml.
Например, создайте два файла log4j2.xml с различными конфигурациями. log4j2.xml & log4j2-debug.xml и передать его ниже кода.

ConfigurationFactory configFactory = XmlConfigurationFactory.getInstance(); 
      ConfigurationFactory.setConfigurationFactory(configFactory); 
      LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
      ClassLoader classloader = Thread.currentThread().getContextClassLoader(); 
      InputStream inputStream = classloader.getResourceAsStream(logFileName); 
      ConfigurationSource configurationSource = new ConfigurationSource(inputStream); 

      ctx.start(configFactory.getConfiguration(ctx, configurationSource)); 
Смежные вопросы