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

Logback配置问题:Spring Boot启动时总是生成空错误日志文件

Logback配置问题:无错误日志时仍生成空文件

需求

  • 所有日志输出到控制台
  • 仅错误日志输出到文件
  • 无错误日志时不创建日志文件

原配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="app" source="spring.application.name"/>
    <springProfile name="development,default">
        <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
        <import class="ch.qos.logback.core.FileAppender"/>
        <timestamp key="byStartDate" datePattern="yyyyMMddHHmmss"/>

        <appender name="FILE" class="FileAppender">
            <file>${LOG_PATH}/error_${byStartDate}.log</file>
            <encoder class="PatternLayoutEncoder">
                <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>

        <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
        <import class="ch.qos.logback.core.ConsoleAppender"/>

        <appender name="STDOUT" class="ConsoleAppender">
            <encoder class="PatternLayoutEncoder">
                <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
        <logger name="org.jooq" level="warn" additivity="false">
            <appender-ref ref="STDOUT"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="FILE"/>
            <appender-ref ref="STDOUT"/>
        </root>
    </springProfile>
</configuration>

问题现象

应用启动后,即使没有任何错误日志输出,日志路径下仍会生成空的错误日志文件。


解决方案

原因

FileAppender在初始化阶段就会创建文件,无论后续是否有符合条件的日志事件写入,这是空文件生成的核心原因。

方案1:使用RollingFileAppender(无需额外依赖)

将原FileAppender替换为RollingFileAppender,它默认会延迟文件创建操作,直到第一个符合过滤条件的日志事件出现。配置示例:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/error_${byStartDate}.log</file>
    <!-- 配置滚动策略,此处设置为仅保留1个文件,达到大小限制时触发滚动 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>${LOG_PATH}/error_${byStartDate}.%i.log</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>1</maxIndex>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>10MB</maxFileSize>
    </triggeringPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

方案2:使用LazyFileAppender(需引入扩展依赖)

Logback扩展库提供了LazyFileAppender,它仅在第一个日志事件写入时才创建文件。

  1. 添加Maven依赖:
<dependency>
    <groupId>ch.qos.logback.extensions</groupId>
    <artifactId>logback-ext-core</artifactId>
    <version>0.1.5</version>
</dependency>
  1. 修改Appender配置:
<appender name="FILE" class="ch.qos.logback.core.LazyFileAppender">
    <file>${LOG_PATH}/error_${byStartDate}.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:02:52