SpringBoot日志系统
日志系统
我们首先要区分一下,什么是日志门面(Facade)什么是日志实现,我们之前学习的JUL实际上就是一种日志实现,我们可以直接使用JUL为我们提供的日志框架来规范化打印日志,而日志门面,如SIf4j,是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j、 logback、java.uti.logging等,它们才实现了具体的日志系统的功能。
日志门面和日志实现就像JDBC和数据库驱动一样,一个是画大饼的,一个是真的去做饼的。
日志门面:
slf4j
日志实现:
Log4j
LogBack
Logging
下图表示slf4j如何实现各种日志框架:
注意:
每一个日志实现框架都有自己的配置文件,使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件。
比如实现框架选用logback,那么配置文件就写logback.xml这种,实现框架选log4j,那么配置就选log4j.xml这种。
slf4j日志门面
Simple Logging Facadefor Java
slf4j是门面的抽象,具体实现可以交给log4j、logback或jdk的logging来实现。
说白了就是slf4j抽象接口支持各大日志框架的实现的支持。
结构图:类似jdbc的厂商
我们用的是slf4j的门面接口,实现的是支持slf4j的实现框架(厂商)。
简单的说,就是接口和接口实现类的关系!
Logback日志实现
要使用slf4j日志就要使用支持slf4j日志的实现。
logging日志框架是log4j的后继者,相对使用较多,我们用这个来举例子。
使用slf4j日志接口实现的是logging的框架实现类。
只要有实现,slf4j就会自动去发现实现它。
然后logging实现就会自动寻找到resource资源路径下的logback.xml配置文件。
需要的jar包:
slf4j-api
logback-core
logback-classic
引入依赖:
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.25version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-coreartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.3version>
dependency>
如果是SpringBoot,则不用引入依赖,本身自带了这些依赖。
logback.xml的配置文件
提示:
输出的格式是可以自由设置
指定输出的日志级别可以设置多个引用
输出日志从高到底输出
输出日志的文件如果没有会自动创建。
日志级别:
从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL, SpringBoot默认只会打印 info 以上级别的信息。
测试:(测试slf4j门面接口实现类是logging实现类框架)
测试结果:
日志的输出是按照日志的指定级别进行输出的,从小到大的级别输出。
slf4j日志的填充功能:
注意:
当slf4j在使用的时候没有导入实现的包,会报找不到实现的错。
奉上logback.xml的配置文件(方便复制)
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %npattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/Users/hbm/Desktop/Java API/ok2.txtfile>
<encoder>
<pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %npattern>
encoder>
appender>
<root level="trace">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
root>
configuration>
或者:
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>UTF-8charset>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log/日志文件.logfile>
<append>trueappend>
<encoder>
<pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %npattern>
<charset>UTF-8charset>
encoder>
appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
root>
configuration>
输出日志级别level可以自己选择。
提示:
官方推荐logback的配置文件名为 logback-spring.xml 或 logback.xml 。
如果不进行logback-spring.xml的配置,则会自动使用springboot默认提供的defaults.xml预设配置,即启动时打印的信息样式配置。如果配置了logback-spring.xml,则会覆盖默认预设配置。
通过上面的学习,可以使用到控制台输出日志信息,一般建议以文件输出日志信息,方便排查bug。
SpringBoot使用日志
SpringBoot为了统一日志框架的使用,,做了这些事情:
直接将其他依赖以前的日志框架剔除
导入对应日志框架的SIi4j中间包
导入自己官方指定的日志实现,并作为SIf4j的日志实现层
在SpringBoot中默认使用的日志门面是Slf4j日志,默认日志实现为LogBack。
SpringBoot中自带了slf4j和logback的依赖,如需更换其他实现,加入依赖即可。
使用默认的slf4j+logback日志:
测试:
/**
* 控制层
* @Author 黄柏茗
* @Date 2022-01-15
*/
@Controller
public class MyController {
//日志
Logger logger = LoggerFactory.getLogger(MyController.class);
@RequestMapping("/test")
public String test() {
logger.info("打印了个小日志");
return "测试日志";
}
}
因为我们使用了Logbok,使用一个 @Slf4j 注解也可以搞定!
/**
* 控制层
* @Author 黄柏茗
* @Date 2022-01-15
*/
@Slf4j //加入注解
@Controller
public class MyController {
@RequestMapping("/test")
public String test() {
//可直接使用日志,更方便
log.info("打印了个小日志");
return "测试日志";
}
}
两者都可以,后者更简洁方便,因为log对象本质上在编译时,lombok插件会自动给它加上Logger对象,使用的还是Logger对象。
所以,在SpringBoot中使用默认的slf4j+logback日志实现就阔以了!
使用步骤请看上面的logback日志实现。
本次实验使用的是SpringBoot+slf4j日志门面+logback日志实现。
总结:
slf4j就是个接口,需要使用接口的实现类,实现类可以自由选择,可以选择log4j或者logback或jdk自带的logging实现等.
推荐使用logback实现,因为logback是log4j的后继者。