logback希望特定的error日志写入到特定文件
1、增加appender
加了过滤器,限定只记录ERROR级别日志 。
<appender name="hzxAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${hzx_LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${hzx_LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<totalSizeCap>2GB</totalSizeCap>
<MaxHistory>15</MaxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<append>true</append>
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>${LOG_PATTERN}</Pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
2、限定只在 local环境下记录
且additivity = false,此时该日志将不会写入到其他文件。
<!-- 本地 -->
<springProfile name="local">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="applicationAppender"/>
<appender-ref ref="errorAppender"/>
</root>
<logger name="hzxLogger" level="ERROR" additivity="false">
<appender-ref ref="hzxAppender"/>
</logger>
</springProfile>
3、代码中使用logger
@RestController
@Slf4j(topic = "hzxLogger")
public class TestController {
扩展知识:
1、可以看到<logger name="hzxLogger" level="ERROR" additivity="false"> 同时 <appender name="hzxAppender" 中也配置 <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter> 只过滤error级别的,是否存在重复配置。
1. 两者的作用机制
a. Logger 的 level="ERROR"
- 作用层级:在 Logger 级别过滤。
- 效果:只有 ERROR 及以上级别 的日志事件会进入该 Logger,低于 ERROR 的日志(如 INFO、WARN)会被直接丢弃,不会传递给任何 Appender。
b. Appender 的 LevelFilter
- 作用层级:在 Appender 级别过滤。
- 效果:即使日志事件通过了 Logger 的级别过滤,LevelFilter 会再次检查级别:
ACCEPT
ERROR 级别的日志。DENY
非 ERROR 级别的日志(但此时这些日志已经通过 Logger 的level="ERROR"
过滤,实际不会到达这里)。
2. 是否冗余?
-
在当前的配置中,这两个过滤是冗余的:
- 由于 Logger 的
level="ERROR"
已经确保只有 ERROR 级别的日志能进入 Appender,Appender 的 LevelFilter 实际上 永远不会遇到非 ERROR 日志,因此<onMismatch>DENY</onMismatch>
是多余的。
- 由于 Logger 的
-
特殊情况:
- 如果 Logger 的
level
设置为低于 ERROR(如INFO
),则 Appender 的 LevelFilter 是必要的,用于进一步过滤出 ERROR 日志。 - 如果 Logger 的
additivity="true"
(默认值),日志事件可能从父 Logger 传递过来,此时 LevelFilter 可能有意义。但你的配置中additivity="false"
,因此无需考虑这种情况。
- 如果 Logger 的
- Logger 的
level
和 Appender 的 LevelFilter 可以同时存在,但需根据场景决定是否需要双重过滤。 - 在大多数情况下,优先使用 Logger 级别过滤,保持配置简洁高效。