【java】动态修改日志级别

背景

  • 开发过程中,为了方便问题快速定位,都会在代码中增加相关日志
  • 生产环境中,为了减少日志输出量,需要提高日志级别,节约资源。

如果能动态修改日志级别,当出现问题时,动态降低日志级别,输出相关的调试信息;问题解决后,动态提高日志级别,屏蔽相关的调试信息。

实现原理

1. log4j

Log4j有三个主要的组件/对象:

  • Loggers(记录器):日志类别
  • Appenders (输出源) :日志要输出的地方
  • Layouts(布局):日志以何种形式输出

想要修改日志级别,主要修改Logger对象,设置输出级别。

1.1 修改根Logger级别

Level level = Level.toLevel(levelName);
LogManager.getRootLogger().setLevel(level);

1.2 修改自定义的Logger级别

Level level = Level.toLevel(levelName);
Logger.getLogger(packageName).setLevel(level);

一般代码中是通过Logger.getLogger(this.getClass)来实例化一个logger,进行日志的打印输出,这都是自定义的logger
如果root logger和自定义logger配置的输出位置不同,取二者的并集,配置的位置都会输出日志
如果root logger和自定义logger配置的输出level不同,主要按照自定义的logger级别输出为主

2. logback

2.1 修改根Logger级别

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).setLevel(Level.toLevel(levelName));

2.2 修改自定义的Logger级别

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger(packageName).setLevel(Level.toLevel(levelName));

应用

  • 对于springboot工程,可以写一个修改日志级别的接口,传参为想要debug的包或者类,调用该接口即可在不重启的情况下实现实时更改日志级别
  • 对于集群或者是想要大批量修改日志级别,可通过配置中心进行配置下发,kafka监听来实现更改
posted @ 2023-03-04 16:31  xiaoyu_jane  阅读(1499)  评论(0编辑  收藏  举报