log4j2 在开发环境(win)下可以输出日志,但在生产环境(linux)无日志输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2 在开发环境(win)下可以输出日志,但在生产环境(linux)无日志输出相关的知识,希望对你有一定的参考价值。

一、问题说明:在开发环境和测试环境下均可以输出日志,但在生产环境无日志输出.

二、发现问题
? ??
?? ?1,系统不同:
?? ??? ?开发环境和测试环境(windows)
?? ??? ?生产环境(linux)
?? ?
?? ?2,提示信息:SLF4J: Class path contains multiple SLF4J bindings(类路径包含多个SLF4J绑定)
?? ??? ??? ?
?? ??? ??? ?a.找到绑定:
?? ??? ??? ?SLF4J: Found binding in [jar:file:/home/service/device/device-tomcat-agv/webapps/showcase/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
?? ??? ??? ?
?? ??? ??? ?b.找到绑定:
?? ??? ??? ?SLF4J: Found binding in [jar:file:/home/service/device/device-tomcat-agv/webapps/showcase/WEB-INF/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]

?? ??? ??? ?c.完整日志:
?? ??? ??? ?SLF4J: Class path contains multiple SLF4J bindings.
?? ??? ??? ?SLF4J: Found binding in [jar:file:/home/service/device/device-tomcat-agv/webapps/showcase/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
?? ??? ??? ?SLF4J: Found binding in [jar:file:/home/service/device/device-tomcat-agv/webapps/showcase/WEB-INF/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
?? ??? ??? ?SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
?? ??? ??? ?SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
?? ??? ??? ?log4j:WARN No appenders could be found for logger (org.springframework.data.repository.config.RepositoryConfigurationDelegate).
?? ??? ??? ?log4j:WARN Please initialize the log4j system properly.
?? ??? ??? ?log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

?? ??? ??? ?
三、排查问题

?? ?1,开发环境和测试环境(windows):
?? ??? ?先加载的是 log4j-slf4j-impl , 后加载的是 slf4j-log4j12 .
?? ??? ?
?? ?2,生产环境:
?? ??? ?先加载的是 slf4j-log4j12 , 后加载的是 log4j-slf4j-impl .
?? ??? ?
?? ??? ?
四、分析问题
?? ?因为: slf4j 优先绑定先加载的 jar包 .
?? ?所以: 开发环境绑定的是 log4j-slf4j-impl .
?? ??? ? ?生产环境绑定的是 slf4j-log4j12 .
?? ?
?? ?官方资料:slf4j 集成 log4j2 时需要的桥接包是 log4j-slf4j-impl 。
?? ?开发环境:slf4j 绑定是正确的,因此可以打印日志。
?? ?生产环境:slf4j 绑定的 jar 包是 slf4j-log4j12 。所以生产环境输出不了日志 (产生这个问题的根本原因是lib里面有多个了slf4j可绑定的jar包)
?? ?

五、解决方案
? ? 由于是 slf4j 绑定 jar 包错误而导致打印不了日志。所以我们必须要把这个 slf4j-log4j12.jar 包排除干净。
?? ?jar 包主要来源有:
?? ?1:zkclient
?? ?2:zookeeper
? ?
? ?
六、问题总结
?? ?1:使用 slf4j + log4j2 时使用的桥接包是 log4j-slf4j-impl
?? ?2:当有多个 slf4j 的桥接包时,一定要排除不需要的包
?? ?3:项目启动时控制台输出的信息很重要,耐心观察启动日志可以解决很多问题

以上是关于log4j2 在开发环境(win)下可以输出日志,但在生产环境(linux)无日志输出的主要内容,如果未能解决你的问题,请参考以下文章

log4j2日志不打印排查过程及处理

SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印

SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印

SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印

log4j2日志发给kafka

Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL