Как динамически изменять уровень журнала в SLF4j или Log4J

Недавно я столкнулся с ситуацией, где Application Loglevel изменяется динамически. Администратор приложения может установить его в INFO/DEBUG/WARN с передней стороны. Исходя из уровня журнала, выбирайте его, чтобы журнал регистрации приложений был изменен.

Я уверен, что регистраторы поддерживают этот сценарий, но не уверены, как я могу добиться этого. Если у кого-то из вас есть идея/мысли, пожалуйста, дайте мне знать.

Заранее благодарим за помощь.

-Narendra

Ответ 1

Рассмотрим журнал http://logback.qos.ch/ - "преемник популярного проекта log4j, собирающийся, когда log4j уходит". Если это предусмотрено инструкцией, logback-classic сканирует изменения в файле конфигурации и автоматически перенастраивается при изменении конфигурационного файла. Кроме того, вы можете управлять уровнями ведения журнала с помощью JMX.

Ответ 2

Динамически невозможно изменить уровень журнала в slf4j, но некоторые серверы для slf4j поддерживают его, включая log4j.

Это решение работало для меня:

org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger();
logger4j.setLevel(org.apache.log4j.Level.toLevel("ERROR"));

(Источник: http://prateep.info/2015/12/12/Dynamically-change-log-level-in-SLF4j-Log4J-with-Standalone-Java-Class/)

Недостатком этого решения является то, что он напрямую использует бэкэнд, который вы не должны делать при использовании slf4j, потому что точка slf4j должна обеспечивать абстракцию от конкретного используемого вами бэкэнда.

Ответ 3

Мне пришлось сделать это один раз с log4j. Единственный способ выяснить, как это сделать, - вызвать getAllAppenders в объекте Logger. Затем проведите через приложения. Если они расширяют класс AppenderSkeleton (они должны), они будут иметь метод setThreshold. Вызовите этот метод с новым уровнем в качестве параметра. Последующие вызовы регистратору должны использовать новый уровень. Это установит уровень в памяти, но не в вашем файле конфигурации log4j. Возможно, вы захотите сделать это, если оно не будет автоматически изменено, когда администратор изменяет уровень через интерфейс. Если это вариант, вы можете рассмотреть следующий совет Евгения Дорофеева и использовать его. Похоже, было бы проще.

Ответ 4

Начиная с версии slf4j 1.7.26 мне удалось изменить уровень ведения журнала.

Вот logback.xml в исходной папке. В случае приложения весенней загрузки вы можете разместить его в папке ресурсов.

<configuration scan="true" scanPeriod="20000">
    <include file="C:/logback-ext.xml"/>
</configuration>

Файл logback-ext.xml хранится в любом внешнем месте. scanPeriod в миллисекундах. В случае неудачи попробуйте использовать include resource вместо include file в logback.xml.

<included>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
          %d{yyyy-MM-dd HH:mm:ss} %-5p [%t] --- %c{1}.%M:%L :: %m %n
      </pattern>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</included>

Мне удалось изменить уровень ведения журнала, шаблон ведения журнала, прикрепить/отсоединить новые и добавить/удалить добавочные устройства.

Это зависимости в pom.xml

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

Ура!