记一次项目上线后Log4j2不输出日志的坑

公司项目采用了Log4j2来输出日志,在开发环境和测试环境下均可以输出日志,但在生成环境就没有日志输出。开始毫无头绪,后来通过不断的排查,终于解决了这个问题。在此记录下该问题的解决过程,便于后续查阅。

一、发现问题

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

开发环境打印日志但生产环境不打印日志这个问题比较棘手。一直找不到原因,后面突然想到在启动的时候打印信息肯定会有所不同。通过在2个环境启动同一个项目的控制台打印信息对比有了以下的发现:

(1)出现了SL4J的警告信息,都是提示包冲突

Multiple bindings were found on the class path

(2)但是仔细观察发现了加载这两个冲突的jar包的顺序不同,具体见下图:

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

①开发环境日志冲突jar包加载顺序图

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

防止图失效,我把文字复制过来了

SLF4J:Class path contains mutiple SLF4J bindings
SLF4J:Found binding in[jar:file:/WEB-INF/lib/log4j-slf4j-impl-2.6.6.jar!/org/slf4j/impl/StaticLoggerBider.class]
SLF4J:Found binding in[jar:file:/WEB-INF/lib/slf4j-log4j12-1.7.22.jar!/org/slf4j/impl/StaticLoggerBider.class]

3

1

SLF4J:Class path contains mutiple SLF4J bindings

2

SLF4J:Found binding in[jar:file:/WEB-INF/lib/log4j-slf4j-impl-2.6.6.jar!/org/slf4j/impl/StaticLoggerBider.class]

3

SLF4J:Found binding in[jar:file:/WEB-INF/lib/slf4j-log4j12-1.7.22.jar!/org/slf4j/impl/StaticLoggerBider.class]

②生产环境日志冲突jar包加载顺序图

防止图失效,我把文字复制过来了

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

SLF4J:Class path contains mutiple SLF4J bindings
SLF4J:Found binding in[jar:file:/WEB-INF/lib/slf4j-log4j12-1.7.22.jar!/org/slf4j/impl/StaticLoggerBider.class]
SLF4J:Found binding in[jar:file:/WEB-INF/lib/log4j-slf4j-impl-2.6.6.jar!/org/slf4j/impl/StaticLoggerBider.class]

3

1

SLF4J:Class path contains mutiple SLF4J bindings

2

SLF4J:Found binding in[jar:file:/WEB-INF/lib/slf4j-log4j12-1.7.22.jar!/org/slf4j/impl/StaticLoggerBider.class]

3

SLF4J:Found binding in[jar:file:/WEB-INF/lib/log4j-slf4j-impl-2.6.6.jar!/org/slf4j/impl/StaticLoggerBider.class]

二、分析

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

  • 在开发环境,先加载的是log4j-slf4j-impl,后加载的是slf4j-log4j12。而生产环境,先加载的是slf4j-log4j12,后加载的是log4j-slf4j-impl。
  • 通过查阅官方资料发现slf4j在绑定时,如果有多个可以绑定的包,SLF4J选择绑定的方式由JVM确定,并且出于所有实际目的应该被认为是随机的。
  • 但是,经过我12次在slf4j源码打断点测试发现slf4j优先绑定先加载的jar包。所以在开发环境slf4j绑定的是log4j-slf4j-impl这个jar包,而在生产环境中绑定的是slf4j-log4j12这个jar包。
  • 通过查阅log4j2官方资料可知,slf4j集成log4j2时需要的桥接包是log4j-slf4j-impl。开发环境中slf4j绑定是正确的,因此可以打印日志。而生产环境中slf4j绑定的jar包是slf4j-log4j12。所以生产环境输出不了日志。产生这个问题的根本原因是lib里面有多个了slf4j可绑定的jar包。

三、解决方案

由于是slf4j绑定jar包错误而导致打印不了日志。所以我们必须要把这个slf4j-log4j12.jar包排除干净。这个包主要来源有:

(1)framework-logger(公司自己封装的框架)

(2)zkclient

(3)zookeeper

排除完jar包后,本地进行打包。打包完成后,必须要检查一遍,看一下生成的打包文件的lib文件夹下是否还存在slf4j-log4j12.jar。如果有,应该是jar包没排除干净。可以通过maven命令查看依赖树,看看是那个依赖把这个jar给传递进来的。命令为:dependency:tree

四、小结

(1)使用SLF4j+Log4j2时使用的桥接包是log4j-slf4j-impl

(2)当有多个SLF4j的桥接包时,一定要排除不需要的包

(2)项目启动时控制台输出的信息很重要,耐心观察启动日志可以解决很多问题

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; line-height: 125%; font-family: "Times New Roman"; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

原文地址:https://www.cnblogs.com/zeng1994/p/df2559e6dc66c99065676e0ee70545eb.html

时间: 2024-08-01 13:28:13

记一次项目上线后Log4j2不输出日志的坑的相关文章

160527、项目上线后session(远程session)

import java.io.Serializable;import java.util.HashMap;import java.util.Map;import java.util.UUID;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.bea

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

文章目录 1.ELK 介绍 2.环境.软件准备 3.ELK 环境搭建 4.Spring Boot 配置示例 4.1.Log4j2 方式配置 4.2.Logback 方式配置 1.ELK 介绍 ELK 是 Elasticsearch , Logstash, Kibana 的缩写,Elasticsearch 是开源分布式搜索引擎,提供搜集.分析.存储数据等功能,Logstash 主要是用来日志的搜集.分析.过滤日志的工具,Kibana 为 Elasticsearch 提供分析和可视化的 Web 平台

项目上线后,谈一下感触比较深的一点:查询优化

前言 开心一刻 儿子有道题不会做,喊我过去教他.我推了推一旁的老公:我头疼,你去吧.老公不动,我:零花钱涨一千.话音刚落,老公就屁颠屁颠跑去儿子房间.进去不到几分钟,一声怒吼伴随着儿子的哭声传来的瞬间,老公从儿子房间出来,边走边说:“朽木不可雕也.”儿子从房间探出半个身子,一脸委屈:“爸爸也不会做,他说给我一块钱,让我明天早点去学校抄同学的.还让我不要告诉你,我不肯,他就吼我.” 问题背景 前段时间,被紧急调到一个新项目,支撑新项目的开发.跌跌撞撞之下,项目也正常上线了,期间收获颇多,无论是业务

iBatis使用log4j2输出日志

原文链接这里 iBatis是一个老项目,2.3.4.726版本发布之后,项目改名为MyBatis,项目主页目前为http://mybatis.github.io/. 我从08年开始接触iBatis,一直使用2.3.4.726版本,直至当前的项目.iBatis恰到好处的满足了项目组在ORM.SQL维护方面的需求,所以也一直懒得换成其它同类开源软件,比如MyBatis. 最近参与新的项目开发,一切都要从零开始.为了节省时间,我直接把原项目中数据库相关操作的代码拿过来使用,发现遇到一个问题.新项目基于

系统上线后WCF服务最近经常死掉的原因分析总结

前言 最近系统上线完修改完各种bug之后,功能上还算是比较稳定,由于最近用户数的增加,不知为何经常出现无法登录.页面出现错误等异常,后来发现是由于WCF服务时不时的就死掉了.后来就开始分析问题.得到的初步解决方案如下: 1.在Web端调用WCF服务使用后,未释放未关闭导致新的链接无法访问 2.增加默认的连接数,系统默认的链接数比较小 3.提供同一个WCF服务的不同实例 1.在Web端调用WCF服务使用后,未释放未关闭导致新的链接无法访问 首先保证客户端每次建立的连接在使用完成后进行关闭.那么请不

java项目上线的流程(将web项目部署到公网)

本博文来源于网络,原文的地址在本篇博文最下方. 如何将java web项目上线/部署到公网 关于如何将Java Web上线,部署到公网,让全世界的人都可以访问的问题.小编将作出系列化,完整的流程介绍. 1.在myeclipse中开发好项目,打包成war格式,不会的同学参考以下 http://zhidao.baidu.com/link?url=Gb0OV9pHiDtJr8nyjPrnSA65g49I4TEAn2N3pwXsxzVsCaX0gJ8RQZHQ2GmDrmdM0ltoBdCPYEtT1i

高校某项目上线小感悟

高校某项目上线第一天到今天正式告一段落,项目取得了成功,得到了学校的认可,各种小感悟集中记录一下吧. 1.小问题不要留到最后解决,留着留着就忘了,一旦发生问题就是很麻烦的事情. 2.项目应该预留充足的测试时间,数据测试不是简单的输入校验,还有业务逻辑校验. 3.数据库字段的长度不能随意设定,最好适当,宁要大,不要小. 4.如果你能事先预料到会发生的问题,那么请立即着手解决,因为它真的就会发生. 5.如果你能预感到客户遗漏的业务需求,你有义务告知客户,这种需求迟早是需要满足的,隐瞒客户不会给自己省

一次大项目上线的总结与思考

最近经历了一次规模不算小的项目开发与上线,过后感触颇多,有成就感,但也有不少经验和教训,总结记下以备后用. 注:考虑到保密问题,有些细节写的很模糊. 1.与旧有系统的兼容性 本次开发的这个项目主要是将旧版系统完全升级(重写)为新版系统,但是由于很多数据是通过旧版系统生成,所以新版系统上线后产生了数据兼容性问题. (1)在测试环境下所有菜单中文没有什么问题,然而上线当天晚上,文件打包发送到服务器上后,发现所有中文变成了乱码,不得已,数十个模板只好一个一个手改,好在不是很多,每人分了几个很快搞定了,

总结:Unity3D游戏上线后的流程回顾

原地址:http://unity3d.9tech.cn/news/2014/0127/39748.html 首先.unity 灯光烘焙 :Unity 3d FBX模型导入.选项Model 不导入资源球.Rig 不导入骨骼.Animations 不导入动画.在Model选项勾选 Generate Linghtmap UVs .否则.灯光烘焙.会出现阴影错乱.灯光烘焙时FBX Shader 选项 Mobile/Unlit(Supports Lightmap). 动态随机地图:地图拼接的时候.注意地图