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

Spring Boot中Logback多Profile启动生成空日志文件问题

解决Logback多Profile下创建多余空日志文件的问题

你碰到的这个问题其实很好理解:所有的RollingFileAppender都定义在全局配置里了,Logback启动初始化的时候,会把全局里的所有Appender都加载一遍——哪怕这个Appender根本没被当前激活的Profile用到,它也会先把对应的空日志文件创建出来。

要实现只生成当前Profile对应的单个日志文件,核心思路就是把每个环境专属的Appender,放到对应的<springProfile>块里面去。这样只有当前激活的Profile才会初始化它自己的Appender,其他环境的Appender根本不会被加载,自然也就不会生成多余的空文件了。

下面是修改后的完整logback-spring.xml配置:

<!-- use Spring default values @see https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml -->
<include resource="org.springframework.boot/logging/logback/defaults.xml" />
<!-- <property name="LOG_PATH" value="." /> -->
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive" />
<property name="LOG_PATH_PROD" value="${LOG_PATH}" />
<property name="LOG_PATH_TEST" value="${LOG_PATH}" />
<property name="LOG_PATH_ACC" value="${LOG_PATH}" />
<property name="LOG_ARCHIVE_PROD" value="${LOG_PATH_PROD}/archive" />
<property name="LOG_ARCHIVE_TEST" value="${LOG_PATH_TEST}/archive" />
<property name="GLOBAL_TEST_LOG_LEVEL" value="INFO" />
<property name="GLOBAL_ACC_LOG_LEVEL" value="INFO" />
<property name="GLOBAL_PROD_LOG_LEVEL" value="ERROR" />
<property name="LOG_FILE_NAME" value="example-wsrest" />

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        <charset>utf8</charset>
    </encoder>
</appender>

<springProfile name="test">
    <appender name="RollingFile-Appender-test" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH_TEST}/${LOG_FILE_NAME}_test.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH_TEST}/${LOG_FILE_NAME}_test_%d{dd-MM-yyyy}_%i.log.zip</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>300MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="${GLOBAL_TEST_LOG_LEVEL}">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="RollingFile-Appender-test" />
    </root>
    <logger name="org.springframework.security" level="${GLOBAL_TEST_LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.springframework.web" level="${GLOBAL_TEST_LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.hibernate" level="${GLOBAL_TEST_LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
</springProfile>

<springProfile name="acc">
    <appender name="RollingFile-Appender-acc" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH_ACC}/${LOG_FILE_NAME}_acc.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH_ACC}/${LOG_FILE_NAME}_acc_%d{dd-MM-yyyy}_%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>300MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="${GLOBAL_ACC_LOG_LEVEL}">
        <appender-ref ref="RollingFile-Appender-acc" />
    </root>
    <logger name="com.example.test" level="DEBUG" additivity="false">
        <appender-ref ref="RollingFile-Appender-acc" />
    </logger>
    <logger name="org.springframework.security" level="${GLOBAL_ACC_LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.springframework.web" level="${GLOBAL_ACC_LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.hibernate" level="${GLOBAL_ACC_LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
</springProfile>

<springProfile name="prod">
    <appender name="RollingFile-Appender-prod" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH_PROD}/${LOG_FILE_NAME}_prod.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH_PROD}/${LOG_FILE_NAME}_prod_%d{dd-MM-yyyy}_%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>300MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="${GLOBAL_PROD_LOG_LEVEL}">
        <appender-ref ref="RollingFile-Appender-prod" />
    </root>
    <!-- To know when the application is ready -->
    <logger name="com.example.test" level="INFO" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <!-- To know about the API endpoints scanned, found & available -->
    <logger name=" org.springframework.data.rest" level="INFO" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <!-- To know when and if the application is started on the embedded Tomcat -->
    <logger name="org.springframework.boot.context.embedded.tomcat" level="INFO" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <!-- To know about filters set, amongst other things -->
    <logger name="org.springframework.data.rest.webmvc" level="INFO" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="com.example.test" level="INFO" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="org.springframework.security" level="${GLOBAL_PROD_LOG_LEVEL}" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="org.springframework.web" level="${GLOBAL_PROD_LOG_LEVEL}" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="org.hibernate" level="${GLOBAL_PROD_LOG_LEVEL}" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
</springProfile>

关键改动说明

  • 把每个环境专属的RollingFileAppender(比如RollingFile-Appender-test)移动到了对应的<springProfile>块内部,只有激活该Profile时才会初始化这个Appender
  • 全局只保留了所有Profile都可能用到的CONSOLE Appender和通用属性配置,避免不必要的初始化
  • 这样修改后,启动test环境时只会创建example-wsrest_test.log,不会再生成prod和acc的空日志文件了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:09:48