目录
mybatis-spring 从1.0.1 升级到 1.3.2 mybatis 3.0.6 -> 3.4.6问题
升级了,log4j2.xml和log4j2.properties却没有生效
为什么要升级,因为log4j不支持高并发,有让服务变慢的风险(本文可能不是升级的最优解,欢迎大家指出交流)
日志框架组成,日志在项目中的组合有很多种方式,例如slf4j+log4j log4j+log4j2 等等,一般来说会使用桥接去转换为某一个框架上,找好对应要升级的包和需要去掉的包
详细的日志框架桥接逻辑可见下文博文所描述
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.jar
- log4j-api-2.x.x.jar
- log4j-core-2.x.x.jar
2.slf4j->log4j2
将slf4j日志,采用log4j2实现进行输出,需要如下jar包
- slf4j-api-x.x.x.jar
- log4j-slf4j-impl-x.x.x.jar
- log4j-api-x.x.x.jar
- log4j-core-x.x.x.jar
已在上线项目使用的版本推荐
- <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);
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>
引入以下依赖
- <dependency>
- <groupId>com.lmax</groupId>
- <artifactId>disruptor</artifactId>
- <version>3.4.2</version>
- </dependency>
因为其他依赖包的原因,需升级mybatis,对应的的mybaits-spring版本也要升级
升级mybaits-spring到1.3.2过后遇到的问题
Cannot load JDBC driver class '${jdbc.mysql.driverClassName}',继承mybatis,读取属性配置文件失败。_恶善的博客-CSDN博客
本人是由于activemq-all这个包导致的,详细推导逻辑见下博文
在Tomcat的VM参数里添加
-Dlog4j.debug
参数来显示log4j的有关信息
解决log4j2配置文件失效的问题_汇编语言不会编的博客-CSDN博客_log4j2配置文件不生效
要排除一些框架内置日志包导致的冲突,例如:
以zookeeper和kafka为例,删除lib目录下的这三个jar包:slf4j-log4j12、slf4j-api和log4
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下载