一、前言
首先需要了解的是:SpringBoot-底层是Spring框架,Spring框架默认是用JCL(commons-logging);‘SpringBoot选用 SLF4j和logback,SLF4j只是一个门面日志,他只定义了接口,并未实现,这样也是为了满足了多态的日志实现,常见的logback和log4j,log4j2都是SLF4j的实现,Logback是由log4j创始人设计的另一个开源日志组件,而log4j2是log4j的一个升级版本。
springboot默认日志框架实现是logback,今天介绍下,如何切换springboot日志框架为log4j2。
二、修改pom文件
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
2.去掉logback相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
这一步建议仔细排查,很多其他的依赖包也是继承或依赖这个logback日志包,需要在其相应的依赖下排除掉,否则很容易springboot启动还是默认原来的logback包,亲自入坑过,排查了好久。idea有相应的插件或功能全局搜索依赖的。
三、新增log4j2.xml配置文件
然后在项目的src/resource目录下添加log4j2.xml日志配置文件:
<?xml version="1.0" encoding="UTF-8"?>
2 <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
3 <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
4 <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
5 <configuration status="WARN" monitorInterval="30">
6 <!--先定义所有的appender-->
7 <appenders>
8 <!--这个输出控制台的配置-->
9 <console name="Console" target="SYSTEM_OUT">
10 <!--输出日志的格式-->
11 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
12 </console>
13 <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
14 <File name="log" fileName="log/test.log" append="false">
15 <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
16 </File>
17 <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
18 <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
19 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
20 <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
21 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
22 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
23 <Policies>
24 <TimeBasedTriggeringPolicy/>
25 <SizeBasedTriggeringPolicy size="100 MB"/>
26 </Policies>
27 </RollingFile>
28 <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
29 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
30 <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
31 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
32 <Policies>
33 <TimeBasedTriggeringPolicy/>
34 <SizeBasedTriggeringPolicy size="100 MB"/>
35 </Policies>
36 <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
37 <DefaultRolloverStrategy max="20"/>
38 </RollingFile>
39 <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
40 filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
41 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
42 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
43 <Policies>
44 <TimeBasedTriggeringPolicy/>
45 <SizeBasedTriggeringPolicy size="100 MB"/>
46 </Policies>
47 </RollingFile>
48 </appenders>
49 <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
50 <loggers>
51 <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
52 <logger name="org.springframework" level="INFO"></logger>
53 <logger name="org.mybatis" level="INFO"></logger>
54 <root level="all">
55 <appender-ref ref="Console"/>
56 <appender-ref ref="RollingFileInfo"/>
57 <appender-ref ref="RollingFileWarn"/>
58 <appender-ref ref="RollingFileError"/>
59 </root>
60 </loggers>
61 </configuration>
四、修改application.properties文件
添加配置:
logging.config = classpath:log4j2.xml
这样springboot启动时就会自动的去加载log4j2.xml文件中的日志配置
注意:log4j和locgback可以配置.properties文件,log4j2好像只支持.xml文件配置,亲测了下,好像确实log4j2如果是properties文件则读取不到文件中的配置。
启动项目,看是否按你配置的log4j2.xml文件配置的日志规范打印的日志。
若出现log4j2相关的日志则配置成功,若还是出现logback相关的日志信息,则还没有配置好,需要好好检查是否有其他pom依赖包还依赖默认的logback包,需要exclusion 排除掉,弱国确定都排除掉了,以上的步骤就能够切换为log4j2日志框架了。