2.x集成log4j2调试日志无法关闭的问题 解决springboot

解决springboot,2.x集成log4j2调试日志无法关闭的问题,博智网带你了解详细信息 。
springboot2.x集成log4j2时,始终无法关闭log4j2自身的日志输出已经做了如下配置:
在log4j2.xml的配置文件中,配置configuration的status属性为OFF;
确认系统所有地方无配置log4j2.debug;
如上配置都无法解决问题,只能从源码着手一探究竟 。
从log4j2-api包中,找到StatusLogger,其设置日志输出level的代码如下:private StatusLogger(final String name,final MessageFactory messageFactory) {super(name, messageFactory);final String dateFormat = PROPS.getStringProperty(STATUS_DATE_FORMAT, Strings.EMPTY);final boolean showDateTime = !Strings.isEmpty(dateFormat);this.logger =new SimpleLogger("StatusLogger", Level.ERROR,false,true, showDateTime,false,dateFormat, messageFactory, PROPS, System.err);this.listenersLevel = Level.toLevel(DEFAULT_STATUS_LEVEL, Level.WARN).intLevel();// LOG4J2-1813 if system property "log4j2.debug" is defined, print all status loggingif (isDebugPropertyEnabled()) {logger.setLevel(Level.TRACE);}}
从上述代码可以看出,level的级别默认是设置为error,仅当有设置log4j2.debug时,才会输出trace日志 。
那log4j2.debug属性在哪设置的呢?带着这个问题,寻找到了SystemPropertiesPropertySource 。这个类在装载属性到Environment前有做自定义处理:
【2.x集成log4j2调试日志无法关闭的问题 解决springboot】private static final String PREFIX ="log4j2."; @Overridepublic CharSequence getNormalForm(final Iterable<?extends CharSequence> tokens) {return PREFIX + Util.joinAsCamelCase(tokens);}
如上述代码所示,该操作会解释所有系统属性,然后按解析后的token自行加上log4j2.的前缀 。在这里导致了日志系统认为需要debug,进而输出trace日志的问题 。
那系统属性上的debug哪来的呢?首先,本地进程是以run模式启动的,环境变量也没有自行设置debug参数,为何会有jvm启动参数中会有 “-Ddebug” 的存在?
查看运行进程的Configurations配置如下所示:

2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


2.x集成log4j2调试日志无法关闭的问题 解决springboot


这是关键的逻辑,原来回去检查是否存在上面几个依赖的类,调试返现没有YAMLFactory这个类,可以看出这个类是jackson包中的,看来是少依赖了包 。
解决引入jackson-dataformat-yaml依赖:
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId></dependency>
启动正常,问题解决 。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧 。

    推荐阅读