log4j升级到log4j2 spring
目录
基础知识
日志系统对应的jar包和推荐依赖
pom.xml
代码可能要修改的地方
log4j2的配置文件
个人问题杂记
去掉父工程的依赖
log4j2异步日志包缺失时报错
mybatis-spring 从1.0.1 升级到 1.3.2 mybatis 3.0.6 -> 3.4.6问题
升级了,log4j2.xml和log4j2.properties却没有生效
项目中用到的MDC也需要升级
为什么要升级,因为log4j不支持高并发,有让服务变慢的风险(本文可能不是升级的最优解,欢迎大家指出交流)
基础知识
日志框架组成,日志在项目中的组合有很多种方式,例如slf4j+log4j log4j+log4j2 等等,一般来说会使用桥接去转换为某一个框架上,找好对应要升级的包和需要去掉的包
日志系统对应的jar包和推荐依赖
详细的日志框架桥接逻辑可见下文博文所描述
https://www.jianshu.com/p/d7b0e981868d
这里直接说结论,利用桥接包,将项目日志用log4j2实现进行输出(出于配置方便的角度考虑,原项目有使用log4j和slf4j)
1.log4j->log4j2
去掉 log4j 1.x jar,添加log4j-1.2-api.jar,配合 log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar 即可,依赖如下
log4j-1.2-api-2.x.x.jarlog4j-api-2.x.x.jarlog4j-core-2.x.x.jar
2.slf4j->log4j2
将slf4j日志,采用log4j2实现进行输出,需要如下jar包
slf4j-api-x.x.x.jarlog4j-slf4j-impl-x.x.x.jarlog4j-api-x.x.x.jarlog4j-core-x.x.x.jar
pom.xml
已在上线项目使用的版本推荐
<properties><slf4j.version>1.7.6</slf4j.version><log4j.version>2.17.1</log4j.version><disruptor.version>3.3.4</disruptor.version>
</properties>
<dependencies><!-- log4j2 start --><!-- log4j-1.2-api必须放在最前面,否则出错 这是log4j2 兼容1 的api 升级必备 可以平滑不改代码升级 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-1.2-api</artifactId><version>${log4j.version}</version></dependency><!-- Listener和Filter相关的配置在Servlet 3.0以上(也就是tomcat7.0以上) 被log4j-web.jar“自动”的初始化了--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j.version}</version></dependency><!-- log4j2的核心包--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j.version}</version></dependency><!-- log4j2的api接口包--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j.version}</version></dependency><!-- slf4j对应log4j2日志框架的驱动包--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j.version}</version></dependency><!-- slf4j的接口包 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><!-- <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency> --><!-- log4j2的异步日志功能包 --><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>${disruptor.version}</version></dependency>
代码可能要修改的地方
如果原项目有引用的桥接包,一般来说可以不动代码,但如果更换依赖过程中报错了,建议更改为log4j2的实例
//Log4j实例:import org.apache.log4j.Logger;private static final Logger LOGGER = Logger.getLogger(X.class);//Slf4j实例: import org.slf4j.Logger;
import org.slf4j.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(X.class);//Log4j2实例: import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;private static final Logger logger = LogManager.getLogger(X.class);
log4j2的配置文件
spring项目,配置文件推荐使用log4j2.xml 因为低版本log4j2中不支持 log4j2.properties文件(log4j2有默认配置,即使没有配置文件依然不会报错)
配置文件 on the classpath 即可实现(也就是放在resources下),可以不在web.xml再配置监听
log4j2.xml完美配置_清风雪的技术博客_51CTO博客
个人问题杂记
记一下自己项目中因为还要兼容一些其他框,在升级过程中遇到的问题
去掉父工程的依赖
结论:在pom.xml中引用父工程的包,再用<scope>来实现打包中不使用
方案来源 maven巧妙排除父pom的依赖_高粱的博客-CSDN博客_maven排除父类依赖
<!-- 剔除父工程包,scope 为test不参与打包 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version><scope>test</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><scope>test</scope></dependency>
什么是scope
Maven依赖中的scope详解_kimy的博客-CSDN博客_maven scope
用<exclusion>去排除它,(不是本人的解决方案)看上去可信度比较高存一下
https://www.csdn.net/tags/MtTaAg4sMDA3MjU1LWJsb2cO0O0O.html
如果项目的pom和<parent>有相同的<groupId> <artifactId>的话 会使用子项目的版本
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>
log4j2异步日志包缺失时报错
引入以下依赖
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version>
</dependency>
mybatis-spring 从1.0.1 升级到 1.3.2 mybatis 3.0.6 -> 3.4.6问题
因为其他依赖包的原因,需升级mybatis,对应的的mybaits-spring版本也要升级
升级mybaits-spring到1.3.2过后遇到的问题
Cannot load JDBC driver class '${jdbc.mysql.driverClassName}',继承mybatis,读取属性配置文件失败。_恶善的博客-CSDN博客
java方法名中画了一条横线 - 简书
升级了,log4j2.xml和log4j2.properties却没有生效
本人是由于activemq-all这个包导致的,详细推导逻辑见下博文
在Tomcat的VM参数里添加
-Dlog4j.debug
参数来显示log4j的有关信息
解决log4j2配置文件失效的问题_汇编语言不会编的博客-CSDN博客_log4j2配置文件不生效
要排除一些框架内置日志包导致的冲突,例如:
以zookeeper和kafka为例,删除lib目录下的这三个jar包:slf4j-log4j12、slf4j-api和log4
项目中用到的MDC也需要升级
log4j MDC NDC详解_星技传阅的技术博客_51CTO博客
借鉴博文
log4j升级到log4j2 - Windy心梦无痕 - 博客园
spring引入log4j2日志框架_逍遥壮士的博客-CSDN博客_spring使用log4j2
日志组件slf4j介绍及配置详解_cc-cf的博客-CSDN博客_slf4j配置
apche的log4j.properties和log4j2.xml的配置和使用_HopeOneToYou的博客-CSDN博客_log4j.properties下载
log4j升级到log4j2 spring相关推荐
- log4j升级为log4j2(无需改动代码)
log4j升级为log4j2(无需改动代码) 1 .删掉项目中存在的Log4j1.x的jar包,添加log4j2的jar包; 2.添加log4j和log4j2的连接包log4j-1.2-api-2.x ...
- linux上设置了log4j没有产生日志文件_关于 log4j 升级到 log4j2 的小结
关于升级 jar 包等前提要求 删掉原先的 log4j-1.XX 等 jar 包 从 1.XX 升级到 2.XX 平稳升级需要的 jar 包,其中包括用 sl4j-1.7.25 (1.7.21 暂时也 ...
- log4j升级为log4j2(不需要改动代码)
公司的项目决定升级log4j,因为log4j2有一个自动删除日志的功能,这样可以减轻运维的一些工作,而且在多线程环境下,log4j2的异步日志系统比log4j和logback提高了十倍的性能(吞吐量和 ...
- 升级到log4j2之后在idea控制台输出日志中文乱码的解决方案
log4j升级到log4j2之后在idea编辑器的控制台输出日志中文乱码 问题概述: 项目组最近升级了日志系统,由log4j升级到了log4j2,在调试的过程中发现我用的idea编辑器的控制台输出中文 ...
- log4j平稳升级到log4j2
一.前言 公司中的项目虽然已经用了很多的新技术了,但是日志的底层框架还是log4j,个人还是不喜欢用这个的.最近项目再生产环境上由于log4j引起了一场血案,于是决定升级到log4j2. 二.现象 虽 ...
- git log 迁移_现场故事:从Log4J迁移到Log4J2
git log 迁移 通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控. 参加AppDynamics APM导览! 与许多Java应用程序一样,AppDynamics Java代理广泛 ...
- 现场故事:从Log4J迁移到Log4J2
通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控. 参加AppDynamics APM导览! 与许多Java应用程序一样,AppDynamics Java代理广泛使用日志记录. 多年来, ...
- log4j升级到logback
虽然现在log4j已经基本上不更新很久了,但实际上升级log4j到logback最大的难度并不在于本身的替换,而是现有大量的三方jar依然使用log4j,以至于无法100%的exclude掉,所以很有 ...
- spring、springboot集成 log4j日志、log4j2日志以及slf4j
1.查看pringboot自带的日志框架 新建一个springboot 工程,查看依赖树 通过查看依赖树可以发现,springboot自带被loggong管理的log4j .logback等日志相关的 ...
最新文章
- 老司机带你学爬虫——Python爬虫技术分享
- SQLALchemy 从数据库导出model
- sccm终于把用户装软件的问题解决了
- USB接口类型的区别
- [转载] python下求语数总分和平均值_R和python语言如何求平均值,中位数和众数
- jabberd2分析
- Qt调用谷歌翻译API
- 嵌入式系统安全实验-下载Linux内核源代码生成内核映像
- 报错java.lang.NoClassDefFoundError: org/jaxen/JaxenException
- [opencv]学习之帧差法实现运动物体检测
- 计算机网络-名词解释整理
- 简述JVM垃圾回收机制
- 以下不是python3保留字的是_python 保留字
- 价值7k美刀的Flickr网站漏洞是怎么样的?
- Spring Data 数据库建模最佳实践
- 阿里巴巴绩效管理理念和原则
- 互联网IT行业岗位分析,程序员、CTO……都是什么?
- vivo X9i的Usb调试模式在哪里,开启vivo X9iUsb调试模式的方法
- matlab solve函数错误【检查对函数 ‘solve‘ 的调用中是否缺失参数或参数数据类型不正确】
- linux img文件 分区挂载
热门文章
- c++ 一个多线程log的实现
- 事件循环机制 (Event Loop)
- RedHadoop创始人童小军在北京开讲“Hadoop2.0集群优化与管理”啦!
- iOS各种调试技巧豪华套餐
- java ssm校园二手书交易平台idea
- win10 VS2017 安装OpenSSL1.1.1
- 2019国内知名桌面云厂家排名
- 完全 彻底 删除 百度云管家
- mysql+免费下载_mysql的下载地址+Download WinMD5
- 【建议】个人竞争力≠个人竞争力模型