目录

  • 一、简介
  • 二、功能说明
  • 2.1、 配置文件
  • 2.2、常用转换符说明
  • 2.2.1、输出日志记录事件的日期
  • 2.2.2、输出日志记录器名称
  • 2.2.3、输出线程
  • 2.2.4、输出日志级别
  • 2.2.5、输出调用方类名
  • 2.2.6、输出调用方方法名
  • 2.2.7、输出日志行号
  • 2.2.8、输出间隔时间
  • 2.2.9、输出日志消息
  • 2.2.10、输出换行
  • 2.2.11、输出堆栈跟踪
  • 2.2.12、输出堆栈跟踪(包含包名)
  • 三、maven依赖
  • 四、滚动策略
  • 4.1 基于时间的滚动策略(TimeBasedRollingPolicy )
  • 4.2 基于大小和时间的滚动策略(SizeAndTimeBasedRollingPolicy)
  • 4.3 基于固定窗口的滚动策略(FixedWindowRollingPolicy)
  • 4.4 开发过程
  • 结语


一、简介

Spring Boot整合logback

二、功能说明

2.1、 配置文件

在类路径下新建对应日志框架的自定义配置文件即可,Spring Boot就不会使用它默认的日志配置文件了

日志系统

支持的自定义配置文件默认名称

Logback

logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy

Log4j2

log4j2-spring.xml、log4j2.xml

JDK (Java Util Logging)

logging.properties

logback-spring.xml,如果logback-spring.xml和logback.xml同时存在,则优先加载logback.xml。但是logback-spring.xml可以使用<springProfile>这个标签。

2.2、常用转换符说明

2.2.1、输出日志记录事件的日期
  • 转换符定义:d{pattern} date{pattern} d{pattern, timezone} date{pattern, timezone}
  • 转换符含义:用于输出日志事件的日期。日期转换字允许模式字符串作为参数。模式语法与java.text.simpleDataFormat接受的格式兼容。
  • 转换符使用:%d{yyyy-MM-dd}、%d{yyyy-MM-dd HH:mm:ss SSS}等

输入

输出

%d

2021-07-20 12:47:04,869

%d{yyyy-MM-dd}

2021-07-20

%d{yyyy-MM-dd HH}

2021-07-20 12

%d{yyyy-MM-dd HH:mm}

2021-07-20 12:44

%d{yyyy-MM-dd HH:mm:ss}

2021-07-20 12:44:08

%d{yyyy-MM-dd HH:mm:ss SSS}

2021-07-20 12:45:48 017

%d{MM-dd HH:mm}

07-20 12:45

%d{HH:mm:ss}

12:46:08

2.2.2、输出日志记录器名称
  • 转换符定义:c{length} lo{length} logger{length}
  • 转换符含义:输出日志事件起源处记录器的名称,可以指定记录器名称的吃长度。记录器名称中最右边的段从不缩写,即使其长度比“长度”选项长。其他段可以缩短到最多一个字符,但永远不会删除。
  • 转换符使用:%c、%c{22}、%lo、 %lo{28}、%logger、%logger{40}

事例:如现有一个类:com.alian.logback.service.LogBackService

输入

输出

%logger

com.alian.logback.service.LogBackService

%logger{22}

c.a.l.s.LogBackService

%logger{28}

c.a.l.service.LogBackService

%logger{34}

c.a.logback.service.LogBackService

%logger{38}

c.alian.logback.service.LogBackService

%logger{40}

com.alian.logback.service.LogBackService

长度小于等于22结果都是c.a.l.s.LogBackService(基本长度是c.a.l.s.LogBackService的长度)
长度大于等于40结果都是com.alian.logback.service.LogBackService

2.2.3、输出线程
  • 转换符定义:t / thread
  • 转换符含义:输出生成日志事件的线程的名称。(即日志输出的线程,这个便于问题线程的定位)
  • 转换符使用:%t、%thread
2.2.4、输出日志级别
  • 转换符定义:p / le / level
  • 转换符含义:输出日志事件的级别(常见的日志级别trace、debug、info、warn、error、fatal)
  • 转换符使用:%p、%le、%level
2.2.5、输出调用方类名
  • 转换符定义:C{length} class{length}
  • 转换符含义:输出发出日志记录请求的调用方的完全限定类名。
  • 转换符使用:%C、%C{5}、 %class、%class{20}
2.2.6、输出调用方方法名
  • 转换符定义:M / method
  • 转换符含义:输出发出日志记录请求的方法名称(也就是程序里调用输出日志的方法名)
  • 转换符使用:%M、%method
2.2.7、输出日志行号
  • 转换符定义:L / line
  • 转换符含义:输出发出日志记录请求的行号(就是程序输出日志的代码所在的行数)。
  • 转换符使用:%L、%line
2.2.8、输出间隔时间
  • 转换符定义:r / relative
  • 转换符含义:输出从应用程序启动到日志事件创建所经过的毫秒数。
  • 转换符使用:%r、%relative
2.2.9、输出日志消息
  • 转换符定义:m / msg / message
  • 转换符含义:输出应用程序提供的与日志事件关联的消息(也就是程序所需要输出的信息)。
  • 转换符使用:%m %msg %message

%m%n、%msg%n、%message%n

2.2.10、输出换行
  • 转换符定义:n
  • 转换符含义:输出平台相关的行分隔符字符(自动识别系统如:windows和linux等)
  • 转换符使用:%n
2.2.11、输出堆栈跟踪
  • 转换符定义:ex{depth} exception{depth} throwable{depth}等
  • 转换符含义:输出与日志事件关联的异常的堆栈跟踪(如果有)。默认情况下,将输出完整堆栈跟踪。
  • 转换符使用:%ex{3}、%exception{short}、%throwable{full}
    任意整数:打印堆栈跟踪的给定行数;short:打印堆栈跟踪的第一行;full:打印完整堆栈跟踪。
2.2.12、输出堆栈跟踪(包含包名)
  • 转换符定义:xEx{depth} xException{depth} xThrowable{depth}等
  • 转换符含义:在异常的每个堆栈帧的末尾,将添加一个字符串,该字符串由包含相关类的jar文件组成,直接指出该jar的版本
  • 转换符使用:%xEx{1}、%xException{short}、%xThrowable{full}

三、maven依赖

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.alian</groupId>
    <artifactId>logback</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>logback</name>
    <description>Spring Boot整合logback</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${parent.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.14</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

四、滚动策略

4.1 基于时间的滚动策略(TimeBasedRollingPolicy )

TimeBasedRollingPolicy承担滚动以及触发所述滚动的责任。实际上,基于时间的滚动策略实现了RollingPolicy和TriggeringPolicy接口。

如果加入了<triggeringPolicy> 文件达到设定大小则不再写入文件(目前Spring Boot版本是2.5.2是没有实现),建议不配置或使用基于大小和时间的滚动策略。MaxHistory设置的是日志保留的份数,不是天数(只有按日滚动才是天数)。

<!--scan:为true时,配置文件如果发生改变,将会被重新加载,默认为true-->
<!--scanPeriod:当scan为true时,监测配置文件是否有修改的时间间隔。如果没有指定时间单位,默认单位是毫秒。默认时间间隔1分钟。英文不要写错了second minute hour-->
<!--debug:为true时,可打印出logback内部日志信息。默认为false-->
<configuration scan="true" scanPeriod="10 second" debug="true">
    <!--定义日志路径-->
    <property name="log.path" value="logs"/>
    <!--定义控制台日志输出格式-->
    <property name="console.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>
    <!--定义控制台日志输出格式-->
    <property name="file.pattern" value="%d{HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>

    <!--控制台日志输出-->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <!--字符串值System.out或System.err之一。默认目标是System.out-->
        <Target>System.out</Target>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${console.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件滚动追加器(基于时间滚动策略按日滚动,最多保存90天历史记录,总文档大小不超过20GB)-->
    <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件命名-->
        <File>${log.path}/app.log</File>
        <!--基于时间滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按日滚动-->
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--按小时滚动-->
            <!--fileNamePattern>logs/app.%d{yyyy-MM-dd_HH}.log</fileNamePattern>-->
            <!--按分钟滚动-->
            <!--<fileNamePattern>logs/app.%d{yyyy-MM-dd_HH-mm}.log</fileNamePattern>-->
            <!--日志保留份数(此处可以说是天数)-->
            <MaxHistory>90</MaxHistory>
            <!--日志文件最大的大小-->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!--触发器(如果文件达到设定大小则不再写入文件,建议去掉或使用基于大小和时间的滚动策略)-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!--设置文件最大大小-->
            <maxFileSize>100MB</maxFileSize>
        </triggeringPolicy>
        <Append>true</Append>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${file.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
    </appender>

    <root level="info">
        <appender-ref ref="Console"/>
        <appender-ref ref="File"/>
    </root>
</configuration>

4.2 基于大小和时间的滚动策略(SizeAndTimeBasedRollingPolicy)

SizeAndTimeBasedRollingPolicy。请注意转换令牌"%i"以及"%d "。%i和%d令牌都是强制性的。每次当前日志文件在当前时间段结束前达到最大文件大小时,都会以增加的索引存档,从 0 开始。
  下例是:基于文件大小和时间的滚动策略按小时滚动,保存60天的历史记录,但所有存档文件最多50GB,每个文件应最多10MB。每个小时都会生成一个文件(如:app.2021-07-21_09.log,app.2021-07-21_10.log),如果在当前时间段结束前达到最大文件大小10MB,则会生成一个带下标的新文件,从0开始(如:app.2021-07-21_09.0.log,app.2021-07-21_09.1.log)。MaxHistory设置的是日志保留的份数,不是天数(只有按日滚动才是天数)。

<!--scan:为true时,配置文件如果发生改变,将会被重新加载,默认为true-->
<!--scanPeriod:当scan为true时,监测配置文件是否有修改的时间间隔。如果没有指定时间单位,默认单位是毫秒。默认时间间隔1分钟。英文不要写错了second minute hour-->
<!--debug:为true时,可打印出logback内部日志信息。默认为false-->
<configuration scan="true" scanPeriod="30 seconds" debug="true">
    <!--定义日志路径-->
    <property name="log.path" value="logs"/>
    <!--定义控制台日志输出格式-->
    <property name="console.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>
    <!--定义控制台日志输出格式-->
    <property name="file.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>

    <!--控制台日志输出-->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <!--字符串值System.out或System.err之一。默认目标是System.out-->
        <Target>System.out</Target>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${console.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件滚动追加器(基于文件大小和时间的滚动策略按小时滚动,每个文件应最多10MB,保存60天的历史记录,但最多50GB)-->
    <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志命名-->
        <File>${log.path}/app.log</File>
        <!--日志滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--请注意转换令牌"%i"以及"%d"。%i 和 %d 令牌都是强制性的,满足条件后索引从0开始-->
            <fileNamePattern>logs/app.%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern>
            <!--日志文件最大的大小-->
            <maxFileSize>10MB</maxFileSize>
            <!--日志保留份数-->
            <MaxHistory>60</MaxHistory>
            <!--总文档大小-->
            <totalSizeCap>50GB</totalSizeCap>
        </rollingPolicy>
        <!--文件追加到末尾-->
        <Append>true</Append>
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${file.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
    </appender>

    <root level="info">
        <appender-ref ref="Console"/>
        <appender-ref ref="File"/>
    </root>
</configuration>

4.3 基于固定窗口的滚动策略(FixedWindowRollingPolicy)

此选项是必需的,并且必须在模式中的某个位置包含整数标记%i。请注意,文件压缩也是通过此属性指定的。例如:fileNamePattern设置为app.%i.log.zip意味着存档文件必须使用zip格式压缩,还支持gz格式。
  下例是:基于固定窗口的滚动策略滚动,最少1个,最多5个,当保存了5个归档文件后,将覆盖最早的日志,文件最大50MB。

<!--scan:为true时,配置文件如果发生改变,将会被重新加载,默认为true-->
<!--scanPeriod:当scan为true时,监测配置文件是否有修改的时间间隔。如果没有指定时间单位,默认单位是毫秒。默认时间间隔1分钟。英文不要写错了second minute hour-->
<!--debug:为true时,可打印出logback内部日志信息。默认为false-->
<configuration scan="true" scanPeriod="30 seconds" debug="true">
    <!--定义日志路径-->
    <property name="log.path" value="logs"/>
    <!--定义控制台日志输出格式-->
    <property name="console.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>
    <!--定义控制台日志输出格式-->
    <property name="file.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>

    <!--控制台日志输出-->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <!--字符串值System.out或System.err之一。默认目标是System.out-->
        <Target>System.out</Target>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${console.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件滚动追加器(基于固定窗口的滚动策略滚动,最少1个,最多5个,文件最大50兆)-->
    <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志命名-->
        <File>${log.path}/app.log</File>
        <!--日志滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!--文件命名格式,支持zip和gz-->
            <fileNamePattern>logs/app.%i.log.zip</fileNamePattern>
            <!--窗口索引的下限-->
            <minIndex>1</minIndex>
            <!--窗口索引的上限-->
            <maxIndex>5</maxIndex>
        </rollingPolicy>
        <!--触发器-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!--设置文件最大大小-->
            <maxFileSize>50MB</maxFileSize>
        </triggeringPolicy>
        <!--文件追加到末尾-->
        <Append>true</Append>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${file.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
    </appender>

    <root level="info">
        <appender-ref ref="Console"/>
        <appender-ref ref="File"/>
    </root>
</configuration>

4.4 开发过程

我们开发过程中也可以增加适当配置查看框架的源码或者数据库执行过程,或者是特定的指定输出。

<!--scan:为true时,配置文件如果发生改变,将会被重新加载,默认为true-->
<!--scanPeriod:当scan为true时,监测配置文件是否有修改的时间间隔。如果没有指定时间单位,默认单位是毫秒。默认时间间隔1分钟。英文不要写错了second minute hour-->
<!--debug:为true时,可打印出logback内部日志信息。默认为false-->
<configuration scan="true" scanPeriod="10 seconds" debug="true">
    <!--定义日志路径-->
    <property name="log.path" value="logs"/>
    <!--定义控制台日志输出格式-->
    <property name="console.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>
    <!--定义控制台日志输出格式-->
    <property name="file.pattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%thread] %level %method %line:%m%n"/>

    <!--控制台日志输出-->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <!--字符串值System.out或System.err之一。默认目标是System.out-->
        <Target>System.out</Target>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${console.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件滚动追加器(基于时间滚动策略按日滚动,最多保存90天历史记录,总文档大小不超过20GB)-->
    <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件命名-->
        <File>${log.path}/app.log</File>
        <!--基于时间滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按日滚动-->
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--按小时滚动-->
            <!--fileNamePattern>logs/app.%d{yyyy-MM-dd_HH}.log</fileNamePattern>-->
            <!--按分钟滚动-->
            <!--<fileNamePattern>logs/app.%d{yyyy-MM-dd_HH-mm}.log</fileNamePattern>-->
            <!--日志保留天数-->
            <MaxHistory>90</MaxHistory>
            <!--日志文件最大的大小-->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!--文件追加到末尾-->
        <Append>true</Append>
        <!--编码器-->
        <encoder>
            <!-- 输出日志信息格式 -->
            <pattern>${file.pattern}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
        <!--只配置最底级别,控制台输出的日志级别大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
    </appender>

    <!-- Sql记录器 -->
    <logger name="jdbc.sqlonly" level="ERROR">
        <appender-ref ref="Console"/>
    </logger>
    <logger name="jdbc.audit" level="ERROR">
        <appender-ref ref="Console"/>
    </logger>
    <logger name="jdbc.resultset" level="ERROR">
        <appender-ref ref="Console"/>
    </logger>
    <logger name="jdbc.connection" level="ERROR">
        <appender-ref ref="Console"/>
    </logger>
    <logger name="jdbc.sqltiming" level="ERROR">
        <appender-ref ref="Console"/>
    </logger>

    <!--spring框架日志-->
    <logger name="org.springframework" level="ERROR"/>
    <logger name="freemarker" level="info"/>

    <root level="info">
        <appender-ref ref="Console"/>
        <appender-ref ref="File2"/>
    </root>
</configuration>

结语

  本文主要介绍了Spring Boot中logback的基本介绍及配置,实际中,如果我们系统的交易不是很频繁,则采用基于时间的滚动策略,且不用加如触发器triggeringPolicy;如果交易系统交易频繁,日志输出多,则可以使用基于大小和时间的滚动策略,比如按天或者按小时;开发中,我们也可以指定各种框架的日志输出,便于我们的学习。