配置文件基本结构
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan: 扫描配置文件的改动内容
scanPeriod: 扫描间隔时间
debug: 输出 logback 框架自身的日志
-->
<configuration debug="false" scan="true" scanPeriod="120 seconds">
<!-- 上下文名称: 默认上下文名称为: default。使用该标签设置成其他名字,用于区分不同应用程序的记录。设置后,不能修改。 -->
<contextName>logback-demo</contextName>
<!-- 定义普通变量: 其他地方通过 ${varName} 的形式进行引用 -->
<property name="PROJECT_NAME" value="logback-demo"/>
<property name="LOG_HOME" value="./applogs"/>
<property name="FILE_PATTERN"
value="%yellow([${springProfile:-}]) %magenta([%X{TraceId}]) %magenta(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow(%-5level) %magenta(${PID:-}) %-20(%yellow([%20.20thread])) %cyan([%-40logger{40}:%L]) -> %msg%n"/>
<!-- 定义 Spring 变量: 依赖 Spring 框架,否则无法获取到值 -->
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<springProperty scope="context" name="springProfile" source="spring.profiles.active"/>
<!-- Appender 配置 -->
<appender name="root_appender" class="..."></appender>
<appender name="logger_appender" class="..."></appender>
<!-- 根节点配置 -->
<root level="...">
<appender-ref ref="root_appender"/>
</root>
<!-- Logger 配置 -->
<logger name="pck_path" level="..." additivity="false">
<appender-ref ref="logger_appender"/>
</logger>
</configuration>
日志等级
定义类:ch.qos.logback.classic.Level
基本级别(从高到低):
- error
- warn
- info
- debug
- trace
特殊级别:
- all:全部级别
- off:关闭日志打印
Appender
定义日志输出的追加器,下面说明两个最常用的配置。
1. 控制台输出
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${FILE_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
2. 输出到日志文件,并配置滚动策略
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输出的日志文件路径 -->
<file>${LOG_HOME}/${PROJECT_NAME}_info.log</file>
<!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 1. 文件名称格式 -->
<fileNamePattern>${LOG_HOME}/${PROJECT_NAME}_info_%d{yyyy-MM-dd}_%i.gz</fileNamePattern>
<!-- 2. 单个日志文件大小的最大值 -->
<maxFileSize>200MB</maxFileSize>
<!-- 3. 最多保几个时间周期 -->
<maxHistory>60</maxHistory>
<!-- 4. 所有日志文件大小的最大值 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- 5. 启动时清除历史日志 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<append>true</append>
<!-- 输出配置 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 1) 输出格式 -->
<pattern>${PRINT_PATTERN}</pattern>
<!-- 2) 编码格式 -->
<charset>utf-8</charset>
</encoder>
<!-- 过滤配置 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 1) 拦截的等级 -->
<level>INFO</level>
<!-- 2) 当匹配时接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 3) 不匹配时拒绝 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
聚焦一下rollingPolicy
标签:
1. 什么是时间周期
根据 fileNamePattern 属性中的 %d 的值的最小时间单位进行判定。
默认值为 yyyy-MM-dd ,即一天为一个周期。
若 %d 的值为%d{yyyy-MM-dd HH:mm:ss}
,则一秒为一个时间周期。
2. fileNamePattern中的 %i 是什么意思
一个时间周期内的多个日志文件,通过 %i 进行索引编号(默认从0开始)。
当一个时间周期没有结束,但是日志内容已经超出了单个日志文件大小的最大值时,会出现这种情况。
3. 日志压缩
格式有哪些(Appender 样例中使用的就是 gzip):
- zip
- gzip
注意:对日志文件进行压缩时,仅仅是对单个日志文件进行压缩。并不是对一个时间周期内的多个日志文件进行压缩,即不是以时间周期的维度进行压缩。
Root
<!-- 根节点配置: 将所有输出的日志,交给引入的 Appender 处理 -->
<root>
<appender-ref ref="INFO"/>
</root>
Logger
<!--
特定 logger 配置: 将特定包路径下的类产生的输出日志交给 Appender 处理。
additivity="false" 表示不将打印内容交给 Root 节点中的 Appender 处理,避免打印内容被多次输出
-->
<logger name="com.xxx.xxx" level="info" additivity="false">
<appender-ref ref="INFO"/>
</logger>
注意,name中的包路径不支持通配符。比如我们想设置:com.xxx.**.mapper
,拦截 com.xxx 所有子包中的 mapper 包下的日志。因为不支持通配符,所以只能配置为:com.xxx
变相的进行实现。