如何在SLF4j或Log4J中动态更改日志级别

时间:2012-11-18 18:06:38

标签: java logging log4j slf4j

最近我遇到了一个应用程序Loglevel动态更改的情况。应用程序管理员可以从前端将其设置为INFO / DEBUG / WARN。根据日志级别选择他应用程序日志记录必须更改。

我确信记录器支持这种情况,但不知道我怎么能实现这一点。如果你们有任何想法/想法请告诉我。

提前感谢您的帮助。

-Narendra

5 个答案:

答案 0 :(得分:13)

无法在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的目的是提供远离你正在使用的特定后端的抽象。

答案 1 :(得分:7)

考虑Logback http://logback.qos.ch/ - “流行的log4j项目的继承者,选择log4j离开的地方”。如果指示这样做,logback-classic将扫描其配置文件中的更改,并在配置文件更改时自动重新配置。此外,您可以使用JMX控制Logback的日志记录级别。

答案 2 :(得分:3)

我必须使用log4j执行此操作一次。我能弄清楚如何做到这一点的唯一方法是在Logger对象上调用getAllAppenders。然后,遍历appender。如果他们扩展了AppenderSkeleton类(他们应该),他们将使用setThreshold方法。使用新Level作为参数调用此方法。对记录器的后续调用应使用新级别。这将在内存中设置级别,但不在log4j配置文件中。您可能也想这样做,除非当管理员通过前端更改级别时它会自动更改。如果这是一个选项,您可能需要考虑遵循Evgeniy Dorofeev的建议并使用logback。这听起来更容易。

答案 3 :(得分:1)

slf4j版本1.7.26开始,我能够更改日志记录级别。

这是源文件夹中的logback.xml。如果是Spring Boot应用,则可能需要将其放置在资源文件夹中。

<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>

干杯!

答案 4 :(得分:1)

对于SLF4J,此代码将演示如何以编程方式(在运行时)控制记录器级别。

此答案假设您使用的是Logback Classic

假定默认SLF4J配置:

final Logger logger = LoggerFactory.getLogger(LoggerListener.class);
// These five statements will log.
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");

final ch.qos.logback.classic.Logger logger2 = (ch.qos.logback.classic.Logger) logger2;
@Nullable
final Level nullablePrevLevel = logger2.getLevel();
final Level level = Level.INFO;
logger2.setLevel(level);
logger.info("Change log level: [{}]->[{}]", nullablePrevLevel, level);

// These three statements will log.
logger.error("error");
logger.warn("warn");
logger.info("info");
// These two statements will not log.
logger.debug("debug");
logger.trace("trace");