Logback 配置文件

2,616 阅读3分钟

一、配置文件格式

1. 根标签

<configuration> 是 logback 配置文件的根标签,其所有的配置内容都要定义在<configuration>标签之内。<configuration>标签包含如下3个常用的属性:

  • scan:当属性值为 true 时,如果配置文件的内容发现变化,则会重新加载配置文件,默认为 true。
  • scanPeriod:设置监测配置文件变化的时间间隔,默认值为60 seconds,即60s,如果单位缺省,则默认单位为毫秒。另外,scanPeriod 只有在 scan 属性值为 true 时,才有效。
  • debug:是否打印 logback 内部的运行日志,默认值为 false,一般无需关心 logback 的内部运行状况。

示例:

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

2. 变量定义

<property/> 标签用来定义变量,定义的变量可以在后续通过${变量名}的方式来引用,<property/> 标签有2个属性值:

  • name:定义变量名称
  • value:定义变量的值

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志目录 -->
    <property name="DEBUG_LOG_PATH" value="logs/debug"/>
    <!-- 定义日志保留天数 -->
    <property name="MAX_HISTORY" value="7"/>
    <!-- 定义日志文件总大小 -->
    <property name="TOTAL_SIZE_CAP" value="10GB"/>
    <!-- 定义单个日志文件大小 -->
    <property name="MAX_FILE_SIZE" value="50MB"/>
</configuration>

3. 日志输出

<appender> 标签用来配置日志的输出,是最重要的一个标签。<appender>标签有2个属性:

  • name:指定 appender 的名称
  • class:指定日志的输出策略,其中ch.qos.logback.core.ConsoleAppender 用来指定日志输出到控制台,ch.qos.logback.core.rolling.RollingFileAppender 用来指定日志输出到滚动文件
3.1 日志格式

<encoder> 标签用来格式化日志,<encoder>有2个子节点<pattern><charset><pattern>指定日志的格式,<charset> 用来指定编码。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
</configuration>

日志输出格式说明:

  • %d{yyyy-MM-dd HH:mm:ss}:表示日期,花括号中指定日期的格式为yyyy-MM-dd HH:mm:ss
  • %thread:表示线程名
  • %-5level:表示日志级别,-5表示从左显示5个字符宽度
  • %logger{36}:表示 logger 的名称,36个字符宽度
  • %msg:表示日志内容
  • %n:表示换行
3.2 日志文件名

<file>标签用来指定日志文件,可以是相对路径,也可以是绝对路径,如果上级目录不存在,会自动创建。<file> 标签只有当 appender 的日志输出策略为日志文件或者滚动文件时才能使用。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志目录 -->
    <property name="DEBUG_LOG_PATH" value="logs/debug"/>
    
    <!-- 输出到滚动文件 -->
    <appender name="DEBUG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEBUG_LOG_PATH}/output.log</file>
        <encoder>
            <!-- 日志输出格式 -->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
</configuration>
3.3 滚动策略

<rollingPolicy> 标签用来指定滚动策略, 所谓的滚动策略其实就是对日志文件进行归档。<rollingPolicy> 标签只有1个class属性,其常见的属性值如下:

  • ch.qos.logback.core.rolling.TimeBaseRollingPolicy:基于时间的滚动策略
  • ch.qos.logback.core.rolling.SizeAndTimeBaseRollingPolicy:基于文件大小和时间滚动策略

<rollingPolicy> 的子标签如下:

  • <fileNamePattern>:指定归档后的日志文件名
  • <maxHistory>:指定日志的保留天数
  • <totalSizeCap>:指定归档文件的总大小,超过其指定的值后,旧的日志文件会被删除
  • <maxFileSize>:指定日志文件的限制大小,在 "基于文件大小和时间滚动策略" 中使用

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志目录 -->
    <property name="DEBUG_LOG_PATH" value="logs/debug"/>
    <!-- 定义日志保留天数 -->
    <property name="MAX_HISTORY" value="7"/>
    <!-- 定义日志文件总大小 -->
    <property name="TOTAL_SIZE_CAP" value="10GB"/>
    <!-- 定义单个日志文件大小 -->
    <property name="MAX_FILE_SIZE" value="50MB"/>
    
    <!-- 输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出格式 -->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <!-- 输出到滚动文件 -->
    <appender name="DEBUG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEBUG_LOG_PATH}/output.log</file>
        <!-- 基于文件大小和时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${DEBUG_LOG_PATH}/output-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <!-- 日志归档文件总大小 -->
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <!-- 日志输出格式 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
</configuration>
3.4 日志过滤

日志级别:TRACE < DEBUG < INFO < WARN < ERROR

如果只需要记录特定的日志,则可以使用 <filter>标签对日志进行过略。<filter> 标签只有1个属性class,用来指定过略器。常用的过滤器有LevelFilter,即按照日志级别来过滤日志(其它的过滤器不做过多的研究)。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志目录 -->
    <property name="DEBUG_LOG_PATH" value="logs/debug"/>
    <!-- 定义日志保留天数 -->
    <property name="MAX_HISTORY" value="7"/>
    <!-- 定义日志文件总大小 -->
    <property name="TOTAL_SIZE_CAP" value="10GB"/>
    <!-- 定义单个日志文件大小 -->
    <property name="MAX_FILE_SIZE" value="50MB"/>
    
    <!-- 输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出格式 -->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <!-- 输出DEBUG日志 -->
    <appender name="DEBUG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEBUG_LOG_PATH}/output.log</file>
        <!-- 基于文件大小和时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${DEBUG_LOG_PATH}/output-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <!-- 日志归档文件总大小 -->
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <!-- 日志输出格式 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 指定日志级别 -->
            <level>DEBUG</level>
            <!-- 匹配则全部接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配则全部拒绝 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
</configuration>

4. root 与 logger

<root> 标签是配置文件中必选的标签,也是特殊的<logger>标签,用来指定基础的日志输出级别,<root> 标签只有1个属性level,用来指定日志级别,默认为debug

<logger> 标签用来限定特定的包的日志输出级别,appender需要和logger进行绑定,否则定义的appender不会生效。(通过<appender-ref/> 中的ref属性进行绑定)。

<logger>有3个属性:

  • name:必选属性,用来指定包名
  • level:可选属性,用来指定日志级别,默认为DEBUG
  • addtivity:是否向上级 logger(一般为 root) 传递日志输出,默认为 true。

tips:如果 addtivity 的属性值为 true,则在当前 logger 所绑定的 appender 中的输出的日志,在 root 绑定的 appender 中也会输出

示例:

在下面例子中,输出到INFO_LOG_FILE中的日志,同样会输出到CONSOLEDEBUG_LOG_FILE 这两个appender

<!-- root -->
<root level="DEBUG">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="DEBUG_LOG_FILE"/>
</root>
<!-- logger -->
<logger name="com.example" level="INFO" addtivity="true">
    <appender-ref ref="INFO_LOG_FILE"/>
</logger>

5. 多环境配置

在 SpringBoot 官网推荐 logback 的配置文件使用*-spring.xml的命名方式,这样在配置文件中就可以使用 SpringBoot 的一些特性,例如:不同的环境输出不同级别的日志。

<springProfile> 标签用来指定 SpringBoot 的配置文件,如下所示:

<!-- 指定profile为default和prod时的日志级别-->
<springProfile name="default,prod">
    <root level="ERROR">
        <appender-ref ref="ERROR_LOG_FILE"/>
    </root>
</springProfile>
<!-- 指定profile为dev和test时的日志级别-->
<springProfile name="dev,test">
    <root level="DEBUG">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="DEBUG_LOG_FILE"/>
        <appender-ref ref="ERROR_LOG_FILE"/>
    </root>
</springProfile>

二、配置文件模板

下面是logback-spring.xml配置文件模板:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志目录 -->
    <property name="DEBUG_LOG_PATH" value="logs/debug"/>
    <property name="INFO_LOG_PATH" value="logs/info"/>
    <property name="WARN_LOG_PATH" value="logs/warn"/>
    <property name="ERROR_LOG_PATH" value="logs/error"/>
    <!-- 定义日志保留天数 -->
    <property name="MAX_HISTORY" value="7"/>
    <!-- 定义日志文件总大小 -->
    <property name="TOTAL_SIZE_CAP" value="10GB"/>
    <!-- 定义单个日志文件大小 -->
    <property name="MAX_FILE_SIZE" value="50MB"/>
   
    <!-- 输出到控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出格式 -->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <!-- 只输出DEBUG日志 -->
    <appender name="DEBUG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEBUG_LOG_PATH}/output.log</file>
        <!-- 基于文件大小和时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${DEBUG_LOG_PATH}/output-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <!-- 日志归档文件总大小 -->
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <!-- 日志输出格式 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 指定日志级别 -->
            <level>DEBUG</level>
            <!-- 匹配则全部接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配则全部拒绝 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 只输出INFO日志 -->
    <appender name="INFO_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${INFO_LOG_PATH}/output.log</file>
        <!-- 基于文件大小和时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${INFO_LOG_PATH}/output-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <!-- 日志归档文件总大小 -->
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <!-- 日志输出格式 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 指定日志级别 -->
            <level>INFO</level>
            <!-- 匹配则全部接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配则全部拒绝 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 只输出WARN日志 -->
    <appender name="WARN_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${WARN_LOG_PATH}/output.log</file>
        <!-- 基于文件大小和时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${WARN_LOG_PATH}/output-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <!-- 日志归档文件总大小 -->
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <!-- 日志输出格式 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 指定日志级别 -->
            <level>WARN</level>
            <!-- 匹配则全部接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配则全部拒绝 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 只输出ERROR日志 -->
    <appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_LOG_PATH}/output.log</file>
        <!-- 基于文件大小和时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${ERROR_LOG_PATH}/output-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 日志文件保留天数 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <!-- 日志归档文件总大小 -->
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <!-- 日志输出格式 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 指定日志级别 -->
            <level>ERROR</level>
            <!-- 匹配则全部接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配则全部拒绝 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 多环境配置 -->
    <springProfile name="default,prod">
        <!-- root -->
        <root level="INFO">
            <appender-ref ref="INFO_LOG_FILE"/>
            <appender-ref ref="ERROR_LOG_FILE"/>
        </root>
	</springProfile>
    
    <!-- 多环境配置 -->
    <springProfile name="dev,test">
        <!-- root -->
        <root level="DEBUG">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="DEBUG_LOG_FILE"/>
            <appender-ref ref="INFO_LOG_FILE"/>
            <appender-ref ref="WARN_LOG_FILE"/>
            <appender-ref ref="ERROR_LOG_FILE"/>
        </root>
	</springProfile>
</configuration>

参考文档