logback-日志配置
1 日志级别
优先级 | 日志级别 | 描述 |
---|---|---|
1 | trace | 追踪,指明程序运行轨迹 |
2 | debug | 调试,实际应用中一般将其作为最低级别 |
3 | info | 输出重要的信息,使用较多 |
4 | warn | 警告 |
5 | error | 错误 |
2 格式
输出格式 | 描述 |
---|---|
%date{yyyy-MM-dd HH:mm:ss.SSS} | 日志生产时间,精确到毫秒 |
%-5level | 日志级别。例如 -5 表示左对齐并且固定输出 5 个字符,如果不足在右边补 0(ILoggingEvent.getLevel 方法返回值) |
%logger | logger 的名称,例如 logger{36} 表示 logger 名字最长 36 个字符(ILoggingEvent.getLoggerName 方法返回值) |
%thread | 输出当前线程名称(ILoggingEvent.getThreadName 方法返回值) |
%p | 日志输出格式 |
%msg | 日志内容 |
%n | 换行符 |
%class | 输出 java 类名 |
%file | 输出文件名 |
%L | 输出错误行号 |
%method | 输出方法名 |
%l | 输出语句所在的行数, 包括类名、方法名、文件名、行数 |
hostName | 本地机器名 |
hostAddress | 本地 ip 地址 |
3 配置文件
1 |
|
3.1 过滤器
logbcak 允许给日志记录器 appender 配置一个或多个 Filter,或者给整体配置一个或多个 TurboFilter 实现当满足过滤器指定的条件时处理日志。
过滤器 | 类型 | 描述 |
---|---|---|
LevelFilter | Filter | 对等于(onMatch)或不等于(onMismatch)指定 level 的日志进行处理 |
ThresholdFilter | Filter | 对大于或等于(onMatch)指定 level 的日志进行处理;小于(onMismatch)指定 level 的日志进行处理 |
EvaluatorFilter | Filter | 对满足(onMatch)或不满足(onMismatch)指定表达式的日志进行处理 |
MDCFilter | TurboFilter | 对等于(onMatch)或不等于(onMismatch) MDCKey 及其 Value 的日志进行处理 |
DuplicateMessageFilter | TurboFilter | 不记录多余的重复的日志。有两个子标签:<cacheSize> 表示内部缓存对旧消息引用的个数上限,默认 100;<allowedRepetitions> 表示允许消息出现的重复次数上限,超过次数上限的记录请求将被丢弃 |
DynamicThresholdFilter | TurboFilter | 动态版的 ThresholdFilter,根据 MDC 域中是否存在某个键,该键对应的值是否相等,可实现日志级别动态切换 |
MarkerFilter | TurboFilter | 对带有指定标记的日志进行处理 |
onMatch、onMismatch 的三种取值和处理方式:
- DENY:拒绝了记录
- NEUTRAL:本级过滤器放行,不记录。注意,如果日志途径的所有过滤器都是 NEUTRAL,则记录
- ACCEPT:需要记录
EvaluatorFilter 例子
在 <appender>
标签中使用,需要额外引入依赖:
1 | // https://mvnrepository.com/artifact/org.codehaus.janino/janino |
当前需要拒绝来自 org.apache.http.wire
类和 org.apache.http.headers
类的日志信息,其他日志记录:
1 | <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> |
MDCFilter 例子
例如,仅记录 MDCKey 为 cando,Value 为 read 的日志:
1 | <turboFilter class="ch.qos.logback.classic.turbo.MDCFilter"> |
DuplicateMessageFilter 例子
限制仅显示 1 条日志
1 | <turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter"> |
测试代码:
1 | log.info(marker, "this is marker"); |
测试代码中第 2-4 行判断为重复,输出结果:
1 | 16:52:01.698 [Test worker] INFO s.ApplicationTests - this is marker |
DynamicThresholdFilter 例子`
测试代码:
1 | MDC.put("null", "none"); |
执行结果:
- 当 key 和 value 都对应时,记录大于等于给定 level 的日志
- 当 key 对应,value 不对应时,按
<DefaultThreshold>
标签处理 - 当 key 不对应时,无论 value 是否对应,所得结果不确定:在首位调用,仅记录
ERROR
,满足<DefaultThreshold>
标签限定;若紧跟其他调用,会与该调用的等级相同。
1 | 13:41:52.810 [Test worker] ERROR s.ApplicationTests - key={ null },value={ none },level={ ERROR } |
MarkerFilter 例子
指定记录带有 test 标记的日志:
1 | <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter"> |
测试代码:
1 | Marker marker = MarkerFactory.getMarker("test"); |
3.2 自定义过滤器
实现一个与上文相同的功能,拒绝来自 org.apache.http.wire
类和 org.apache.http.headers
类的日志信息,其他日志记录:
1 | public class LogbackFilter extends Filter<ILoggingEvent> { |