Springboot默认使用Slf4j和Logback进行日志操作。Slf4j是日志门面,可以看作是日志框架的统一接口;Logback是日志实现,是日志框架的内核。这里介绍如何在Springboot中配置和使用Slf4j和Logback。
关于Springboot的日志框架的介绍,可以参考博文:Spring杂谈之SpringBoot统一日志处理。
一、依赖包配置
- slf4j-api在很多包里面都会有,因此会彼此冲突,如果不解决冲突的话后面的Logback配置可能会失效;
- 解决依赖冲突可以参考博文:如何解决Maven依赖冲突,在IDEA中下载Maven Helper插件可以轻松查看已安装依赖之间的冲突并排除;
- 由于是在Springboot框架中,所以除了spring-boot-starter-web依赖外的slf4j-api均要排除,也不需要引入完整的slf4j-api依赖,参考博文:Springboot 系列(四)Spring Boot 日志框架;
- lombok是注解工具,引入之后可以使用@Slf4j来注解日志对象;
<dependencies>
<!--1.logger dependency-->
<!-- <!– https://mvnrepository.com/artifact/org.slf4j/slf4j-api –>-->
<!-- <dependency>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- <artifactId>slf4j-api</artifactId>-->
<!-- <version>2.0.0-alpha5</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.0-alpha5</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!--2.spring boot dependency-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
二、配置Logback
- 在resources文件夹中增加logback-spring.xml文件;
- 在logback-spring.xml文件中可以很方便地配置日志的输出位置、格式、输出级别等内容;
- 关于配置文件各个标签的含义和参数,可以参考博文:springboot @Slf4j+logback 配置详解;
- appender的配置控制了日志的输出位置;
- appender官方文档在:https://logback.qos.ch/manual/appenders.html;
- SizeAndTimeBasedRollingPolicy设置了滚动日志文件输出,当FileNamePattern中的时间标志位不一致时,会自动创建用新时间标志位命名的日志文件(也就是%d{yyyy-MM});当日志文件达到maxFileSize后,会自动在日志文件后改序号创建新的日志文件(也就是%i)。
- pattern主要是通过字符串来定义的,一些符号含义如下,参考博文:日志组件slf4j介绍及配置详解:
- AsyncAppender用来包装FileAppender,实现日志的异步输出,提高日志输出的性能;
- root定义了所有文件的日志输出级别;
- 如果需要差异化定义某个包或者类的日志输出级别,可以用logger来定义,但要使用additivity="false",否则日志会输出两遍,参考博文:logback系列之一:输出日志到控制台;
- 一个实例的配置文件如下,主要参考博文:Java Slf4j日志配置输出到文件中;
<?xml version="1.0" encoding="UTF-8"?>
<!--scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
<!--scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- contextName: 上下文名称,关联应用程序 -->
<contextName>DISPATCHER</contextName>
<!-- property: 相当于xml中的变量,可在下文中以${name}使用 -->
<property name="log.path" value="./logs"/>
<property name="server.name" value="dispatcher"/>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
<property name="log.file" value="${log.path}/${server.name}_%d{yyyy-MM}_%i.log"/>
<!-- 控制台输出 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 滚动文件输出 -->
<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>${log.file}</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>0</MaxHistory>
<!-- 日志文件最大大小 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<ImmediateFlush>true</ImmediateFlush>
</appender>
<!-- 异步文件输出 -->
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>5000</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>false</includeCallerData>
<appender-ref ref="rollingFileAppender"/>
</appender>
<!-- logger: 某个包或者类的日志打印级别 -->
<!-- 不指定appender则继承root的appender -->
<logger name="cn.jeremy" level="DEBUG" additivity="false">
<appender-ref ref="consoleAppender"/>
</logger>
<!-- root: 所有文件的日志输出级别 -->
<root level="INFO">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="asyncFileAppender"/>
</root>
</configuration>
三、在Springboot配置中关联Logback配置文件
- 打开application.yml,增加以下配置:
logging:
config: classpath:logback-spring.xml
- 主要是让Springboot找到配置的文件;
- 但其实不显式写在application.yml,Springboot也能找到,因为Logback配置文件的路径和命名按照了Springboot的默认存放路径,参考博文:logback RollingFileAppender使用详解;
- 建议Logback配置文件命名为logback-spring.xml,这样可以在application.yml文件之后扫描到,application.yml文件中的路径配置才能生效,参考博文:springboot项目使用slf4j控制台输出日志+输出日志文件到本地;
- 但因为是在默认扫描的路径下,所以直接命名为logback.xml应该也可;
四、使用Slf4j日志操作
- 引入lombok包,不然没法用注解:
import lombok.extern.slf4j.Slf4j;
- 在类前加注解@Slf4j;
- 使用直接用log对象即可,运行时会自动注入日志对象,如:
log.error("Load config error.");
- 不使用注解的日志操作方式可以参考博文:SpringBoot系列——Logback日志,输出到文件以及实时输出到web页面 ;