SLF4j+Logback的组合
一、SpringBoot的日志框架选用的什么技术?
SpringBoot的日志框架选用的是目前市面上最流行的SLF4j+Logback的组合,SLF4j负责日志门面,Logback负责日志实现。
日志门面SLF4j框架图谱
SLF4j+Logback的组合
SpringBoot的日志框架选用的是目前市面上最流行的SLF4j+Logback的组合,SLF4j负责日志门面,Logback负责日志实现。
日志门面SLF4j框架图谱
视频解释上面的图谱:
项目中别的框架使用了各种日志,并非SLF4j,那么就需要统一日志,最后共同使用SLF4j进行日志输出。
统一SLF4j日志的方法为:
1、在IEDA开发工具下查看依赖包关系的方法:
2、找到日志包的依赖网
spring-boot-starter-logging
底层日志包依赖关系
SpringBoot底层使用的是SLF4j+Logback组合的进行日志记录。
3、pom.xml中引入其他框架的依赖,一定要移除掉这个框架自带默认的日志依赖,否则会引起jar包冲突。
比如Spring 框架自带的日志框架commons-logging,那么如果在SpringBoot项目中依赖Spring,就需要移除掉这个默认的日志。移除标签<exclusions>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.3.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
1、日志级别由低到高分别是trace<debug<info<warn<error。
写一个输出日志级别的代码如下:
package com.test.demo.springbootdemo01;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootDemo01ApplicationTests {
//日志记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
logger.trace("trace日志");
logger.debug("trace日志");
logger.info("info日志");
logger.warn("warn日志");
logger.error("error日志");
}
}
结果,SpringBoot默认的日志级别是info,比info级别高的都会生效,级别低的就被过滤掉了。
输出级别为:
2020-04-19 17:40:45.968 INFO 11604 --- [ main] c.t.d.s.SpringbootDemo01ApplicationTests : info日志
2020-04-19 17:40:45.968 WARN 11604 --- [ main] c.t.d.s.SpringbootDemo01ApplicationTests : warn日志
2020-04-19 17:40:45.968 ERROR 11604 --- [ main] c.t.d.s.SpringbootDemo01ApplicationTests : error日志
2、SpringBoot如何修改默认的日志级别呢?
application.yml配置文件这么写:
logging:
level:
com.test.demo: warn
或者使用application.properties配置文件这么写:
logging.level.com.test.demo=warn
这样就可以将项目的日志级别写改为warn。
3、日志的其他设置
%d表示日期
%thread表示线程名
%-5level表示级别从左显示5个字符宽度
%logger{50}表示logger名字最长50个字符,否则按句点分隔
%msg表示日志消息
%n表示换行符
application.yml配置文件代码如下:
logging:
path: /spring/logs #指定日志存放的文件夹,文件名默认是spring.log
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n' #控制台日志输出格式
file: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n' #日志文件输出内容格式
或者使用application.properties配置文件这么写:
logging.path=/spring/logs
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
需要注意的是,设置输出日志时,因为yml配置文件,开头不能使用%符号,所以必须在首尾加上单引号。
需要在项目下添加logback的配置文件logback-spring.xml或者logback.xml。
推荐使用logback-spring.xml,因为加上spring的后缀后,可以使用SpringBoot的高级功能,在配置文件中添加指定环境的配置。
#指定的是开发环境
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
</springProfile>
#指定的是非开发环境
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
</springProfile>
在application.yml中添加激活dev的配置
spring:
profiles:
active: dev
在application-dev.yml中添加日志级别和日志存放的文件夹
#启动端口
server:
port: 8080
logging:
path: /spring/logs
level:
com.test.demo: debug
config: classpath:logback-spring.xml
最后编写logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 读取yml文件中的值 -->
<springProperty scope="context" name="logPath" source="logging.path"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.test.demo.TestLayout">
<appName>test</appName>
</layout>
</encoder>
</appender>
<!--每天生成日志文件-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件 -->
<File>${logPath}.log</File>
<filter class="com.test.demo.filter.LogEventFilter"/>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.test.demo.TestLayout">
<appName>test</appName>
</layout>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<fileNamePattern>${logPath}_%d{yyyy-MM-dd}.log</fileNamePattern>
<!--最多保留5天的日志-->
<MaxHistory>5</MaxHistory>
</rollingPolicy>
</appender>
<appender name="fileLevel" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<root>
<level value="DEBUG" />
<!-- <appender-ref ref="STDOUT" /> -->
<appender-ref ref="fileLevel" />
</root>
</configuration>