Springboot2.0 配置Log4j的问题
springboot自带的日志是spring-boot-starter包下的LogBack日志。如果想改为Log4j的话,需要注意哪些问题呢?
问题一:springboot版本号问题
如图,我这里用到的springboot版本是:2.0.5.RELEASE 。直接引入Log4j包,省略版本号的写法,会报错。找不到Log4j。
**原因**:spring-boot-starter-log4j的最新版本是:**1.3.8.RELEASE**,省略版本是写法是**2.0.5.RELEASE**,自然找不到。
**解决方法**:加上版本号。
问题二:Slf4j依赖冲突问题
如图,我们直接引入了**spring-boot-starter-web**和**spring-boot-starter-log4j**包。
**运行异常**:Slf4j版本冲突
**原因**:新引进的spring-boot-starter-log4j包和spring-boot-starter-web包下的spring-boot-starter包下的Logback包(**三层关系**)中的Slf4j冲突。
**解决方法**:移除spring-boot原有的日志包。如图
移除后,继续run,依然报slf4j冲突,为什么呢?明明已经移除了孙子的依赖。
问题三:Slf4j依赖冲突问题是maven标签导致的吗?
我们先来熟悉下maven的exclusion标签:
1、我们知道Logback是传递依赖进来的,它们的关系如下:
spring-boot-starter-web–>spring-boot-starter–>spring-boot-starter-logging
我们上面是在一级依赖移除三级依赖。我本来以为只能移除直属的包,不能移除孙子(下下层)的包。然后看maven官网对于exclusion标签的介绍,没毛病啊,能移除下下层的依赖啊
maven官网对exclusion标签的介绍:http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html?spm=a2c4e.10696291.0.0.1d3919a4FqX9gW#
2、既然官网说不是,我还是尝试了下:
我把maven代码改成如下:
运行项目,居然,slf4j冲突解决了。。。
wtf??
问题四:为什么重新引用starter包,移除log就能生效?
为什么重新引用spring-boot-starter包,移除log就能生效?我在spring-boot-starter-web移除就无效?
回到问题本身,Slf4j版本冲突。
问:那是谁和谁冲突?
答:log4j和lobback中的slf4j冲突。
问:能不能找到冲突的包?
问:如何找到冲突的包?
灵光一闪,管它springboot还是啥,看依赖。pom文件右键看jar包依赖:
最终发现,是springboot的定时器包引用了spring-boot-starter。虽然我们在spring-boot-starter-web移除了,但还是有依赖,所以最好的办法就是上面的配置,重新引用starter,然后移除logging。
总结
其实,官网的配置已经很规范了。我们看官网怎么配的。虽然走了些弯路,但总算把问题解决了。主要的问题就是包冲突,要学会如何查看、处理包冲突。
官网地址:https://docs.spring.io/spring-boot/docs/1.5.19.RELEASE/reference/htmlsingle/#howto-configure-log4j-for-logging