写在前面

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文件;
  • springboot 集成redission 报错 springboot集成slf4j_spring boot

  • 在logback-spring.xml文件中可以很方便地配置日志的输出位置、格式、输出级别等内容;
  • 关于配置文件各个标签的含义和参数,可以参考博文:springboot @Slf4j+logback 配置详解;
  • appender的配置控制了日志的输出位置;
  • appender官方文档在:https://logback.qos.ch/manual/appenders.html;
  • SizeAndTimeBasedRollingPolicy设置了滚动日志文件输出,当FileNamePattern中的时间标志位不一致时,会自动创建用新时间标志位命名的日志文件(也就是%d{yyyy-MM});当日志文件达到maxFileSize后,会自动在日志文件后改序号创建新的日志文件(也就是%i)。
  • pattern主要是通过字符串来定义的,一些符号含义如下,参考博文:日志组件slf4j介绍及配置详解:

springboot 集成redission 报错 springboot集成slf4j_java_02

  • 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使用详解;

springboot 集成redission 报错 springboot集成slf4j_日志文件_03

  • 建议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页面 ;