SpringBoot中logback日志框架详细配置教程

SpringBoot中logback日志框架详细配置教程

LM 415 2023-03-13

依赖配置

默认情况下,Spring Boot会用logback来记录日志,并用INFO级别输出到控制台。

logbackSpring Boot 默认的日志框架 ,spring-boot-starter中包含了 spring-boot-starter-logging

若非Spring Boot环境则需要添加以下依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

日志级别

日志级别从低到高分为:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

例如:日志级别设置为 WARN ,则低于 WARN 的信息都不会输出。
Spring Boot中默认级别为INFO,即只会输出ERRORWARNINFO级别的日志输出到控制台。

日志配置

application.yml

日志级别

  • logging.level.*: 设置指定package前缀内日志输出内容的级别

控制台输出

  • logging.pattern.console:设置控制台中输出的日志的样式

文件输出

  • logging.pattern.file:设置日志文件中日志的样式

  • logging.file:设置日志文件名,可以是绝对路径,也可以是相对路径。如:logging.file=my.log

  • logging.path:设置日志保存目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

    如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。
    如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log

    二者不能同时使用,如若同时使用,则只有logging.file生效

logback-spring.xml

使用xml后要将application.yml中的配置去掉,避免冲突。

默认情况下将logback-spring.xml放在resources目录下,就能自动被Spring Boot加载。

想要自定义文件名可配置application.ymllogging.config指定配置文件名。

根节点<configuration>

  • scan:设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true

  • scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scantrue时,此属性生效。默认的时间间隔为1分钟。

  • debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false

二级节点<root>

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。

  • level:用来设置打印级别,大小写不敏感,可填入TRACEDEBUGINFOWARNERRORALLOFF,不能设置为INHERITED或者同义词NULL。默认为DEBUG。可以包含零个或多个元素,标识这个logger的内容将会输出到这个appender

    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_INFO"/>
    </root>
    

二级节点<contextName>

默认上下文名称为default。可以设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称,一般不用这个属性,可有可无。

<contextName>logback</contextName>

二级节点<property>

用来定义变量值的标签, 有两个属性

  • name:设置属性名,可以使用${name}来使用变量
  • value:设置name对应的值

二级节点<include>

引用其他xml配置,例如引用默认的控制台日志输出实现

  • resource:设置引用文件位置

    <!--使用默认的控制台日志输出实现-->
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    

二级节点<springProperty>

读取application.yml内的配置定义变量值

  • name:定义变量名

  • scope:指定存储属性作用域,一般填写context

  • source:设置application.yml中的配置名

  • defaultValue:设置默认值,若application.yml中无此配置项则使用该默认值

    <!--日志文件保存路径-->
    <springProperty name="LOG_FILE_PATH" scope="context" source="logging.file.path" defaultValue="./logs"/>
    

二级节点<appender>

appender用来格式化日志输出节点,用来指定控制台输出策略和文件输出策略。

  • name:设置该appender的名称
  • class:设置该appender的输出策略

控制台输出ConsoleAppender

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <appender name="consoleLogLayout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>ERROR</level>
        </filter>
    </appender>
    
    <appender name="consoleLogEncoder" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>
        </filter>
    </appender>

    <root level="INFO">
        <!--appender将会添加到这个loger-->
        <appender-ref ref="consoleLogLayout"/>
        <appender-ref ref="consoleLogEncoder"/>
    </root>

</configuration>

输出到文件RollingFileAppender

日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志

<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>DENY</onMatch>
        <onMismatch>ACCEPT</onMismatch>
    </filter>

    <File>${logback.logdir}/info.${logback.appname}.log</File>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
        <maxHistory>90</maxHistory>
        <maxFileSize>10MB</maxFileSize>
    </rollingPolicy>

    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
    </encoder>
</appender>
通用三级节点<layout><encoder>
  • class:指定实现类

layoutencoder,都可以将事件转换为格式化后的日志记录,encoder就是把 LoggingEvent转化为字节数组并向 OutputStream(输出流)写出,layout 就是能够把 LoggingEvent转换成字符串。

相比较之下,layout既不能控制 LoggingEvent何时输出,也不能把 LoggingEvent聚合成批(batches)。 但是encoder既能控制LoggingEvent输出格式,也能控制LoggingEvent何时输出。

一般控制台输出使用layout,文件输出使用encoder

有以下子节点:

  • <pattern>:表示对日志进行编码:

    • %d{HH: mm:ss.SSS}——日志输出时间

    • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用

    • %-5level——日志级别,并且使用5个字符靠左对齐

    • %logger{36}——日志输出者的名字

    • %msg——日志消息

    • %n——平台的换行符

  • <charset>:表示对日志进行编码的编码字符集设定,例如UTF-8

通用三级节点<filter>
  • class:指定过滤策略

    • ch.qos.logback.classic.filter.ThresholdFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMathonMismatch接收或拒绝日志。有以下子节点:

      • <level>:设置过滤级别
    • ch.qos.logback.classic.filter.LevelFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。有以下子节点:

      • <level>:设置过滤级别

      • <onMatch>:用于配置符合过滤条件的操作

      • <onMismatch>:用于配置不符合过滤条件的操作

RollingFileAppender三级节点<File>

配置日志名称,如果没有<File>属性,那么只会使用<rollingPolicy>内的<FileNamePattern>的文件路径规则,如果同时有<File><FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即<File> 的日志都是当天的

RollingFileAppender三级节点<rollingPolicy>
  • class:指定滚动策略
    • ch.qos.logback.core.rolling.TimeBasedRollingPolicy:按照时间滚动

有以下子节点:

  • <FileNamePattern>:设置文件命名格式
  • <maxHistory>:日志文件保留天数,默认7天
  • <maxFileSize>:设置日志文件大小,超过就重新生成文件,默认10M

二级节点<logger>

  • name:指定受此logger约束的某一个包或者具体的某一个类
  • level:设置日志打印级别,大小写不敏感,若未设置此属性,当前logger将会继承上级的配置
  • addtivity:是否向上级logger传递打印信息。默认是true
带有logger的配置,不指定级别,不指定appender

logback-spring.xml增加 logger 配置如下:

<logger name="com.example.controller"/>
<root level="info">
    <appender-ref ref="console"/>
</root>

<root level="info">root的打印级别设置为info,指定了名字为consoleappender

<logger name="com.example.controller" />将控制controller包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“info”;没有设置addtivity,默认为true,将此loger的打印信息向上级传递;没有设置appender,此logger本身不打印任何信息。

当执行com.example.controller包中类的方法时,首先执行<logger name="com.example.controller"/>,将级别为info及大于info的日志信息传递给root,本身并不打印; root接到下级传递的信息,交给已经配置好的名为consoleappender处理,名为consoleappender 将信息打印到控制台

带有多个loger的配置,指定级别,指定appender

logback-spring.xml增加 logger 配置如下:

<logger name="com.example.controller" level="WARN" additivity="false">
    <appender-ref ref="console"/>
</logger>
<root level="info">
    <appender-ref ref="console"/>
</root>

控制com.example.controller包下的类的日志打印,打印级别为“WARN”; additivity属性为false,表示此loger的打印信息不再向上级传递;指定了名字为“console”的appender

这时候执行com.example.controller包下的类的方法时,先执行<logger name="com.example.controller" level="WARN" additivity="false">,将级别为WARN及大于WARN的日志信息交给此logger指定的名为consoleappender处理,在控制台中打出日志,不再向上级root传递打印信息。

二级节点<springProfile>

  • name:指定输出环境,可以选择多个环境,用,隔开

    <configuration>
        ...
        <!-- 测试环境+开发环境. 多个使用逗号隔开 -->
        <springProfile name="test,dev">
            <logger name="com.example.controller" level="DEBUG" additivity="false">
                <appender-ref ref="consoleLog"/>
            </logger>
        </springProfile>
        
        <!-- 生产环境 -->
        <springProfile name="prod">
            <logger name="com.example.controller" level="INFO" additivity="false">
                <appender-ref ref="consoleLog"/>
            </logger>
        </springProfile>
    </configuration>
    

参考

Spring Boot 日志配置(超详细) - 简书 (jianshu.com)

logback_2-Encoder,Layout_胡小禾的博客-CSDN博客

springboot超级详细的日志配置(基于logback) - 腾讯云开发者社区-腾讯云 (tencent.com)

logback Filter LevelFilter ThresholdFilter - Dandwj - 博客园 (cnblogs.com)