目录

logback希望特定的error日志写入到特定文件

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、可以看到 同时 <appender name=“hzxAppender”  中也配置 

ERROR

ACCEPT

DENY

  只过滤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 的 level 设置为低于 ERROR(如 INFO ),则 Appender 的 LevelFilter 是必要的,用于进一步过滤出 ERROR 日志。
    • 如果 Logger 的 additivity="true" (默认值),日志事件可能从父 Logger 传递过来,此时 LevelFilter 可能有意义。但你的配置中 additivity="false" ,因此无需考虑这种情况。
  • Logger 的 level 和 ​ Appender 的 LevelFilter 可以同时存在,但需根据场景决定是否需要双重过滤。

  • 在大多数情况下,优先使用 ​ Logger 级别过滤 ,保持配置简洁高效。