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,可按需调整参数。
为什么你的原配置没生效?
大概率是这两个原因:
- 你的error appender没有被添加到root logger中,导致ERROR日志根本没流向这个appender;
- 用了错误的过滤规则,比如用
ThresholdFilter导致没精确过滤级别,或者过滤规则写反了。
内容的提问来源于stack exchange,提问作者TheFouzhy
相关产品推荐
相关产品推荐

