一、Springboot日志介绍
一般现在都是使用Springboot框架,Springboot日志也是开发中常用的日志系统。Springboot默认使用的slf4j作为日志门面,Logback作为日志实现来记录日志。
我们一般创建Springboot项目都是会引入Spring web启动器,在这个启动器坐标中就包含了日志依赖!
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
这个就是Spring web启动器,其中就包含了日志依赖。
在spring-boot-starter-web—Spring-boot-starter—spring-boot-starter-logging,我们通过对应的依赖就能找到其中的日志启动器,接下来我们就看看在Springboot中配置了什么日志依赖、日志实现,首先看下引入的日志启动器坐标:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.4.3</version> <scope>compile</scope> </dependency>
我们在IDEA中查看下日志依赖的图表:
log4j-to-slf4j、jul-to-slf4j都是slf4j的桥接器(分别是log4j与JDK自带日志的slf4j实现)。
log4j-api:Log4j2的日志门面。
slf4j-api:日志门面。
logback-classic、logback-core:则是日志实现框架。
所以由此我们能够知道Springboot底层默认使用slf4j日志门面以及Logback作为日志实现,并且也可以使用log4j2作为日志门面,但是最终依旧也是通过slf4j来调用logback。
二、实际使用(slf4j+logback)
2.1、Springboot无配置文件进行日志打印
通过slf4j日志门面默认使用的logback日志实现框架
创建一个Springboot项目,引入Spring web模块,直接进行测试(在test目录中):
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SpringBootTest class SpingbootlogApplicationTests { private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class); @Test void contextLoads() { LOGGER.warn("WARN"); LOGGER.error("error"); LOGGER.info("info");//默认日志等级 LOGGER.debug("debug"); LOGGER.trace("trace"); } }
说明:在Springboot中默认日志等级为INFO,并且日志打印格式包含了年月日时分秒毫秒、日志等级、线程号、线程名(main)、全限定类名以及msg(输出的信息)。
通过log4j2日志门面来进行日志输出(默认还是用logback日志实现框架输出)
解释:虽然使用的是log4j2日志门面,不过底层依旧会使用桥接器(log4j-to-slf依赖引入的实现类)切换为slf4j门面并依旧使用的是Logback日志实现框架输出。
和上面一样,通过测试类进行输出:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @SpringBootTest class SpingbootlogApplicationTests { //通过Log4j2的日志门面来获取Logger private static final Logger LOGGER = LogManager.getLogger(SpingbootlogApplicationTests.class); @Test void contextLoads() { LOGGER.warn("WARN"); LOGGER.error("error"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); } }
与直接使用slf4j日志门面的效果一样,最终还是使用的logback日志实现。
2.2、application.properties配置日志格式
配置+测试程序
本文2.1中是输出日志文件是直接使用的Springboot的默认配置,本部分我们在application.properties中进行简单配置:
# 指定自定义logger对象日志级别 logging.level.xyz.changlu=trace # 指定控制台输出格式 包含日志等级、年月日时分秒毫秒 全限定类名 方法名 行号 线程名 错误信息 logging.pattern.console=[%-5level] %d{yyyy-MM-dd HH:mm:ss:SSS} %c %M->%L [%thread] ===== %msg %n # ①指定存放日志文件的具体路径(springboot2.4.3中使用无效) # logging.file=/logs/logback.log # ②指定日志文件存放的目录,默认创建文件名为 spring.log (存储路径说明:/对应c:/) # 若是这两个配置文件路径的参数一起使用时则会默认使用logging.file(不推荐!!!) logging.file.path=/logs/springboot # 指定输出到日志文件消息格式 logging.pattern.file=[%-5level] %d{yyyy-MM-dd HH:mm:ss:SSS} %c %M->%L [%thread] ===== %msg %n
自定义Logger日志等级设置。
指定控制台输出的格式。(输出到控制台)
指定文件输出消息格式、存储文件路径。(输出到文件)
程序测试:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SpringBootTest class SpingbootlogApplicationTests { private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class); @Test void contextLoads() { LOGGER.warn("WARN"); LOGGER.error("error"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); try { int sum = 5/0; } catch (Exception e) { LOGGER.debug("报错",e); } } }
控制台输出内容:
输出到文件内容:
其他说明:在application.properties中配置的信息比较有限,通常我们使用自定义配置文件来进行日志的配置
2.3、自定义配置文件(常用)
通过application.properties来进行配置日志显然不太够,像一些根据文件大小拆分的RollingFileAppender都不能够进行配置,所以我们一般会通过自定义配置文件来进行配置,常用的不同的日志框架对应使用的配置文件名称如下:
日志框架 |
配置文件 |
Logback |
logback-spring.xml , logback.xml |
Log4j2 |
log4j2-spring.xml , log4j2.xml |
JUL |
logging.properties |
可以看到我们使用Logback日志实现框架的配置文件可以是两种名称,使用Logback-spring.xml我们可以根据不同环境的切换来设置不同的日志格式输出,我们在下面介绍。
①logback.xml配置
logback.xml配置实例
logback.xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/> <!-- 配置ConsoleAppender --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 输出流对象(红色) --> <target>System.err</target> <!-- 日志格式配置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${pattern}</pattern> </encoder> </appender> <!-- 配置FileAppender --> <appender name="file" class="ch.qos.logback.core.FileAppender"> <!-- 配置文件路径 --> <file>d:/logs/logback.log</file> <!-- 日志格式设置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${pattern}</pattern> </encoder> </appender> <!--自定义logger additivity:表示是否从 rootLogger继承配置--> <logger name="xyz.changlu" level="info" additivity="false"> <appender-ref ref="console"/> <appender-ref ref="file"/> </logger> </configuration>
简述:使用自定义logger配置ConsoleAppender、FileAppender,关闭继承RootLogger。
测试程序:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SpringBootTest class SpingbootlogApplicationTests { private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class); @Test void contextLoads() { LOGGER.warn("WARN"); LOGGER.error("error"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); try { int sum = 5/0; } catch (Exception e) { LOGGER.debug("报错",e); } } }
可以看到更改输出流system.err输出的字体为红色了。
②logback-spring.xml配置(环境切换用途)
logback-spring.xml配置(主要说明额外用途)
logback-spring.xml同样也可以进行配置,那么为什么已经有logback.xml进行配置还能使用logback-spring.xml配置呢?
答:logback-spring.xml中我们能够根据application.properties中spring.profiles.active=dev配置来决定我们的日志格式输出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BImeH2ud-1615826520263)(C:\Users\93997\AppData\Roaming\Typora\typora-user-images\image-20210313221154810.png)]
①logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/> <!-- 配置ConsoleAppender --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 输出流对象(红色) --> <target>System.err</target> <!-- 日志格式配置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- *********************************************************** --> <!-- 根据application.properties中spring.profiles.active=dev配置决定 --> <springProfile name="dev"> <pattern>${pattern}</pattern> </springProfile> <springProfile name="pro"> <pattern>%d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level ======= %msg%n</pattern> </springProfile> <!-- *********************************************************** --> </encoder> </appender> <!--自定义logger additivity:表示是否从 rootLogger继承配置--> <logger name="xyz.changlu" level="info" additivity="false"> <appender-ref ref="console"/> </logger> </configuration>
可以看到我们与之前不同的是在11-18行中间多添加了<springProfile>键值对,有什么用途呢?其会根据在application.properties中设置spring.profiles.active=dev键值对来进行选择对应的pattern格式。
②application.properties
# 设置为开发环境 spring.profiles.active=dev # 设置为生产环境 # spring.profiles.active=pro
我们可以通过设置对应的spring.profiles.active值来进行生产、开发环境的切换
测试程序:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SpringBootTest class SpingbootlogApplicationTests { private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class); @Test void contextLoads() { LOGGER.warn("WARN"); LOGGER.error("error"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); try { int sum = 5/0; } catch (Exception e) { LOGGER.debug("报错",e); } } }
说明:这个格式与我们在logback-spring.xml中配置的有关,对于输出哪种格式则会与application.properties中键值对指定的有关。
注意点:若是在logback.xml中配置<springProfile>键值对,那么一定要在application.properties中配置spring.profiles.active=dev或spring.profiles.active=pro,若不配置会报错!!!报错信息如下:
报错信息说初始化时配置出现null!
注意点
注意点:当我们使用自定义配置文件时,application.properties配置文件中的日志配置以及spirngboot默认配置不生效!!!
若是自定义配置文件并且不配置任何logger、appender信息如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> </configuration>
运行程序会出现以下情况:
logback-spring.xml配置如上信息,运行程序如下:
logback.xml配置如上信息,运行程序如下:
一定要注意!!!
三、Springboot中使用Log4j2(未来趋势)
原本Springboot中默认使用的是slf4j+logback,随着现如今log4j2的强势来袭,之后会慢慢使用slf4j+log4j2的搭配,那么我们如何在Springboot中配置并使用呢?
①首先移除原先的spring-boot-starter-logging坐标依赖,添加新的启动器:spring-boot-starter-log4j2
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除了日志依赖 --> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- log4j2的相关依赖包含了slf4j对于log4j2的实现类 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
我们看新引入依赖的结构:
log4j-core、log4j-api:log4j的核心jar包以及日志门面。
log4j-slf4j-impl:slf4j针对于log4j2的接口实现类jar包。
log4j-jul、jul-to-slf4j:log4j-jul不太清楚,jul-to-slf4j是slf4j针对于jul的桥接器实现slf4j的日志门面API。
这样的话我们就能够使用slf4j+log4j2来进行搭配使用了!
②紧接着我们引入配置文件log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" monitorInterval="5"> <!-- 日志处理 --> <Appenders> <!-- 控制台输出 appender --> <Console name="Console" target="SYSTEM_ERR"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L ======= %m%n" /> </Console> </Appenders> <!-- 设置rootLogger --> <Loggers> <Root level="info"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
仅在屏幕中打印,并且设置err形式输出日志。
测试程序:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SpringBootTest class SpingbootlogApplicationTests { private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class); @Test void contextLoads() { LOGGER.warn("WARN"); LOGGER.error("error"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); try { int sum = 5/0; } catch (Exception e) { LOGGER.debug("报错",e); } } }
通过这样的方式我们就能够在Springboot中使用log4j2了!!!
总结
1、springboot2.4.3中的spring-boot-starter-web—Spring-boot-starter—spring-boot-starter-logging的日志启动器中包含依赖有:log4j-to-slf4j、jul-to-slf4j(桥接器);log4j-api、slf4j-api:日志门面;logback-classic、logback-core:则是日志实现框架。默认使用的是slf4j+logback。—见第1部分
2、Springboot默认日志等级为INFO。—见2.1
3、Springboot中配置文件方式两种,第一种是在application.properties中进行简单配置;第二种是自定义配置文件可以使用logback.xml或logback-spring.xml这两个配置文件都能够进行普通配置。比较特殊的是logback-spring.xml,其可以根据application.properties中的键值对如spring.profiles.active=dev来选择对应环境的自定义输出格式。—见2.2、2.3
<!-- logback-spring.xml --> <!-- 一但配置了这个springProfile的标签,若不配置application.properties的配置项控制台就会报null错 --> <springProfile name="dev"> <pattern>${pattern}</pattern> </springProfile> <springProfile name="pro"> <pattern>%d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level ======= %msg%n</pattern> </springProfile>
# application.properties spring.profiles.active=dev
4、当进行自定义配置文件时,Springboot的默认配置以及application.properties中的关于日志配置都会无效!!!—见2.3中的注意点
5、若想在springboot中使用log4j2需要先移除掉spring-boot-starter-logging坐标依赖,接着导入spring-boot-starter-log4j2坐标并添加配置文件即可!!!—见第3部分