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配置如下所示:










这是关键的逻辑,原来回去检查是否存在上面几个依赖的类,调试返现没有YAMLFactory这个类,可以看出这个类是jackson包中的,看来是少依赖了包 。
解决引入jackson-dataformat-yaml依赖:
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId></dependency>
启动正常,问题解决 。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧 。
推荐阅读
- 帅丰集成灶怎么清洗 帅丰集成灶如何清洗
- 小车大灯怎么开
- 买手集成什么意思
- 集成灶好吗
- 油烟机好还是集成灶好 集成灶好还是油烟机好?
- 独步天下电视剧中东哥第几集成为海兰珠
- 核显和主板集成显卡哪个好
- 集成墙板的优点有哪些
- 集成灶怎样跑业务
- 独立显卡和集成显卡的区别是什么
