07、Springboot日志使用
@[toc]
前言
本篇文章使用环境如下:
IDEA
:2020.1Springboot
:2.4.3
本篇文章主要介绍Springboot
中默认使用的日志门面以及日志框架(slf4j+logback
)以及介绍了在Springboot项目中如何配置Log4j2的日志实现!
所有博客文件目录索引(包含日志框架系列学习):博客目录索引(持续更新)
一、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部分
参考资料
[1] 视频:2020年Java进阶教程,全面学习多种java日志框架
- 点赞
- 收藏
- 关注作者
评论(0)