【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监听来实现更改