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

Nar*_*dra 14 java logging log4j slf4j

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

我确信记录器支持这种情况,但不知道我怎么能得到这个.如果你们有任何想法/想法请告诉我.

在此先感谢您的帮助.

-Narendra

out*_*ave 14

在slf4j中无法动态更改日志级别,但slf4j的一些后端支持它,包括log4j.

这个解决方案对我有用:

org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger();
logger4j.setLevel(org.apache.log4j.Level.toLevel("ERROR"));
Run Code Online (Sandbox Code Playgroud)

(来源:http://prateep.info/2015/12/12/Dynamically-change-log-level-in-SLF4j-Log4J-with-Standalone-Java-Class/)

这个解决方案的缺点是它直接使用后端,在使用slf4j时你不应该这样做,因为slf4j的目的是提供远离你正在使用的特定后端的抽象.


Evg*_*eev 9

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


kev*_*rpe 7

对于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) logger;
@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");
Run Code Online (Sandbox Code Playgroud)


小智 5

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