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,它仅在第一个日志事件写入时才创建文件。
- 添加Maven依赖:
<dependency> <groupId>ch.qos.logback.extensions</groupId> <artifactId>logback-ext-core</artifactId> <version>0.1.5</version> </dependency>
- 修改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
相关产品推荐
相关产品推荐

