SpringBoot教程(十九) | SpringBoot集成Slf4j日志门面
一、概述
对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。
slf4j
,log4j
,logback
,JDK Logging
等这些日志框架都是我们常见的日志框架,
本文主要介绍SpringBoot整合Sfl4j+logback的操作。
二、前言
从Spring Boot
的1.x版本开始,它就默认集成了Logback作为日志框架。
这一默认配置在后续版本中得到了保持,尽管用户仍然有选择使用其他日志框架(如Log4j2)的自由。
本文也是主要讲 Logback(日志框架)+Slf4j(日志门面)
三、引入依赖 (不需要额外引入了)
在Spring Boot 1.X版本后 中使用logback+SLF4J作为日志记录,通常不需要额外引入依赖。
Spring Boot的设计理念之一就是“开箱即用”(Convention Over Configuration),它通过提供一系列的启动器(starters)来简化项目的依赖管理和配置。
对于日志记录,Spring Boot 1.X版本后 默认集成了SLF4J作为日志门面(Facade),并提供了logback作为日志实现的默认选择。
这意味着,当你创建一个基于Spring Boot 1.X的新项目时,只要你引入了spring-boot-starter
(或其包含日志功能的变体,如spring-boot-starter-web
),
Spring Boot就会自动配置logback和SLF4J,你无需手动添加这些依赖。
依赖包含情况
spring-boot-starter
:这是一个核心的Spring Boot启动器,它包含了Spring Boot的核心功能,包括自动配置支持、日志(logback+SLF4J)等。spring-boot-starter-web
:这个启动器用于开发Web应用程序,它包含了spring-boot-starter
,因此也间接包含了logback和SLF4J的依赖。
四、自定义Logback的配置文件(一般都需配置)
Spring Boot 会自动从类路径(classpath)中查找 logback-spring.xml、logback-classic.xml、logback.groovy 和 logback.xml 文件(按照顺序),并使用它们作为 Logback 的配置。
情况一:不配置任何关于logback的配置文件
- 默认日志级别:Spring Boot的默认日志级别为INFO
- 日志格式:Spring Boot在控制台上的默认日志输出格式可能因版本而异,但通常包含时间戳、日志级别、线程名称、日志输出者的名称(通常是类名或文件名)以及日志消息本身。
- 默认文件输出:如果不进行任何配置,Spring Boot通常不会将日志输出到文件中,而是仅输出到控制台
情况二:配置关于logback的配置文件
- 文件名:命名为
logback-spring.xml
(在SpringBoot项目中一般情况下以这个命名)- 位置:把logback-spring.xml 文件放到
src/main/resources
目录下
( Spring Boot 会在启动时自动加载这个文件,而无需你在 application.yml 或 application.properties 中进行任何配置)- 如果你是想自定义这个xml的名称 或者 自定义路径
可以通过logging.config属性配置
例如:logging.config=classpath:logging-config.xml 去操作
日志常用的五个级别,根据严重程度由低到高,依次为:debug(调试 ) < info(消息) < warn(警告) < error(错误) < fatal(严重错误)。
通常可以根据实际所需要的颗粒度的大小选择其中的几个,当前常用debug,info,warn,error4个级别。一般都是配置的info级别
logback.xml 具体内容
记住,Logback 的配置本身并不直接支持将 System.out 和 System.err 的输出重定向到日志文件中的哦
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="D:/logs/" ></property>
<!-- 彩色日志 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([%-10.10thread]){faint} %clr(%-5level) %clr(%-50.50logger{50}:%-3L){cyan} %clr(-){faint} %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 (只能是 由 Logger 或者 LoggerFactory 记录的日志消息哦)-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/pro.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-10.10thread] %-5level %-50.50logger{50}:%-3L - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" ></logger>
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" ></logger>
<logger name="org.hibernate.SQL" level="DEBUG" ></logger>
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" ></logger>
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" ></logger>
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE" ></logger>
<logger name="java.sql.Connection" level="DEBUG" ></logger>
<logger name="java.sql.Statement" level="DEBUG" ></logger>
<logger name="java.sql.PreparedStatement" level="DEBUG" ></logger>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" ></appender-ref>
<appender-ref ref="FILE" ></appender-ref>
</root>
</configuration>
扩展:
如果你想要将logback.xml配置文件中的变量抽取到application.yml或application.properties中
可以 使用springProperty
标签
例如:
<configuration>
<!-- 定义属性,从application.yml或application.properties中读取 -->
<springProperty scope="context" name="customLogLevel" source="logging.custom.level" defaultValue="INFO"/>
<!-- 使用该属性设置日志级别 -->
<logger name="com.example.myapp" level="${customLogLevel}"/>
<!-- 其他配置... -->
</configuration>
application.yml 示例:
logging:
custom:
level: DEBUG
或者,如果你使用的是application.properties:
logging.custom.level=DEBUG
五、如何使用
(一)不使用 @Slf4j 注解
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
// 关键点
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
public void someMethod() {
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message", new RuntimeException("Oops!"));
}
}
(二)使用 @Slf4j 注解
- 1.需要引入Lombok依赖
特别注意:
当Lombok的设置为provided时,在打jar/war包时就不会把这个Lombok库打进去。
但是由Lombok注解在编译时生成的代码(比如使用@Data帮忙生成的get、set方法)还是会正常存在于编译后的类文件中,可以通过反编译工具查看。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>你的Lombok版本号</version>
<scope>provided</scope>
</dependency>
- 2.具体使用
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MyService {
public void doSomething() {
log.debug("This is a debug message");
log.info("This is an info message");
log.warn("This is a warn message");
log.error("This is an error message", new RuntimeException("Oops!"));
}
}
参考文章
【1】SpringBoot项目引入logback进行项目日志管理
【2】SpringBoot整合Sfl4j+logback的实践
【3】springboot整合日志+多环境配置+热部署