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> { |