You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring LogBack配置异常:error.log为空且未记录ERROR日志排查

LogBack配置:解决error.log无法记录ERROR级日志的问题

首先,我得帮你捋清楚可能踩的坑:你引入了Spring Boot的base.xml,这个配置里已经默认设置了root logger和一些appender,很可能你的自定义appender没被正确关联,或者过滤规则配置不对,导致ERROR日志没流到error.log里。

下面是我调整后的完整配置,直接替换你的配置文件就能解决问题:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 引入Spring Boot的基础日志配置,保留其日志格式等通用设置 -->
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <!-- 重新定义root logger,替换base.xml默认的文件appender,避免重复日志 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" /> <!-- 保留控制台输出,可按需删除 -->
    </root>

    <!-- 配置info.log:仅记录INFO级别的日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/info.log}</file>
        <!-- 复用Spring Boot默认的文件日志格式 -->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 配置滚动策略:按时间和文件大小分割日志 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/info.%d{yyyy-MM-dd}.%i.log}</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <!-- 核心过滤规则:只接受INFO级日志,其他全部拒绝 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 配置error.log:仅记录ERROR级别的日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/error.log}</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/error.%d{yyyy-MM-dd}.%i.log}</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <!-- 核心过滤规则:只接受ERROR级日志,其他全部拒绝 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 把自定义的两个文件appender关联到root logger,让日志流到这两个文件 -->
    <root level="INFO">
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

关键细节说明:

  • 避免base.xml的默认appender冲突:我重新定义了root logger,替换了base.xml里默认的文件输出appender,这样不会出现日志重复或者自定义appender被覆盖的情况。
  • 精准的级别过滤:用LevelFilter而不是ThresholdFilter,因为ThresholdFilter会接受指定级别及以上的日志(比如设置ERROR的话,WARN、INFO也会被接受),而我们需要的是仅记录对应级别,所以LevelFilter的精确匹配更合适。
  • 日志滚动策略:配置了按时间和文件大小分割的策略,避免日志文件过大,同时保留30天的历史日志,总大小不超过1GB,可按需调整参数。

为什么你的原配置没生效?

大概率是这两个原因:

  1. 你的error appender没有被添加到root logger中,导致ERROR日志根本没流向这个appender;
  2. 用了错误的过滤规则,比如用ThresholdFilter导致没精确过滤级别,或者过滤规则写反了。

内容的提问来源于stack exchange,提问作者TheFouzhy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:00:12