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

如何从指定Spring Profile中排除log4j2.xml实现分环境日志输出

实现方案

你可以通过以下两种保留XML配置的方式实现不同Spring Profile对应不同日志输出策略,无需移除原XML文件:

方案1:多配置文件按Profile区分

Spring Boot支持为不同Profile指定独立的Log4j2配置文件,操作步骤如下:

  1. 在src/main/resources目录下创建两份XML配置:
    • 开发环境配置log4j2-dev.xml:仅保留控制台输出相关的Appender、Logger配置
    • 生产环境配置log4j2-prod.xml:保留你当前的滚动文件输出配置
  2. 在对应Profile的application配置文件中指定日志配置路径,例如application-dev.yml添加:
logging:
  config: classpath:log4j2-dev.xml

application-prod.yml同理指定log4j2-prod.xml路径即可。

方案2:单份XML内置Profile条件判断

如果你希望所有配置都放在同一份XML文件中,可以使用Log4j2支持的<SpringProfile>标签,按激活的Profile动态加载对应配置,修改后的完整配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns:log4j='http://jakarta.apache.org/log4j/'
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="http://jakarta.apache.org/log4j/ http://jakarta.apache.org/log4j/ ">
    <Properties>
        <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger{0} %X{akkaSource} %msg%n"/>
        <property name="LOGS_BASE_DIRECTORY" value="logs"/>
        <property name="BASE_DIR" value="logs"/>
    </Properties>
    <Appenders>
        <!-- 所有环境都生效的控制台输出 -->
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout pattern="${FILE_PATTERN}"/>
        </Console>
        <!-- 仅生产环境(prod profile)生效的文件输出appender -->
        <SpringProfile name="prod">
            <RollingFile name="SERVICE" fileName="logs/service.log"
                         filePattern="${LOGS_BASE_DIRECTORY}/archived/$${date:yyyy-MM}/service-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
                <PatternLayout>
                    <Pattern>${FILE_PATTERN}</Pattern>
                </PatternLayout>
                <Policies>
                    <SizeBasedTriggeringPolicy size="50 MB"/>
                </Policies>
            </RollingFile>
            <RollingFile name="CONTROLLER" fileName="logs/controller.log"
                         filePattern="${LOGS_BASE_DIRECTORY}/archived/$${date:yyyy-MM}/service-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
                <PatternLayout>
                    <Pattern>${FILE_PATTERN}</Pattern>
                </PatternLayout>
                <Policies>
                    <SizeBasedTriggeringPolicy size="50 MB"/>
                </Policies>
                <DefaultRolloverStrategy>
                    <Delete basePath="${BASE_DIR}" maxDepth="2">
                        <IfLastModified age="3D"/>
                    </Delete>
                </DefaultRolloverStrategy>
            </RollingFile>
            <RollingFile name="KAFKA" fileName="logs/kafka.log"
                         filePattern="${LOGS_BASE_DIRECTORY}/archived/$${date:yyyy-MM}/service-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
                <PatternLayout>
                    <Pattern>${FILE_PATTERN}</Pattern>
                </PatternLayout>
                <Policies>
                    <SizeBasedTriggeringPolicy size="50 MB"/>
                </Policies>
                <DefaultRolloverStrategy>
                    <Delete basePath="${BASE_DIR}" maxDepth="2">
                        <IfLastModified age="3D"/>
                    </Delete>
                </DefaultRolloverStrategy>
            </RollingFile>
            <RollingFile name="HIBERNATE" fileName="logs/hibernate.log"
                         filePattern="${LOGS_BASE_DIRECTORY}/archived/$${date:yyyy-MM}/service-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
                <PatternLayout>
                    <Pattern>${FILE_PATTERN}</Pattern>
                </PatternLayout>
                <Policies>
                    <SizeBasedTriggeringPolicy size="50 MB"/>
                </Policies>
                <DefaultRolloverStrategy>
                    <Delete basePath="${BASE_DIR}" maxDepth="2">
                        <IfLastModified age="3D"/>
                    </Delete>
                </DefaultRolloverStrategy>
            </RollingFile>
        </SpringProfile>
    </Appenders>
    <Loggers>
        <!-- 开发环境(dev profile)仅输出到控制台 -->
        <SpringProfile name="dev">
            <Logger name="ua.zhytariuk.planningsystem.controller" level="info" additivity="false">
                <appender-ref ref="CONSOLE"/>
            </Logger>
            <Logger name="ua.zhytariuk.planningsystem.exception" level="error" additivity="false">
                <appender-ref ref="CONSOLE"/>
            </Logger>
            <Logger name="ua.zhytariuk.planningsystem.aspect.ServiceLoggingAspect" level="trace" additivity="false">
                <appender-ref ref="CONSOLE"/>
            </Logger>
            <Logger name="ua.zhytariuk.planningsystem.broker.kafka" level="debug" additivity="false">
                <appender-ref ref="CONSOLE"/>
            </Logger>
            <Logger name="org.hibernate" level="debug" additivity="false">
                <appender-ref ref="CONSOLE"/>
            </Logger>
            <root level="debug">
                <appender-ref ref="CONSOLE"/>
            </root>
        </SpringProfile>
        <!-- 生产环境(prod profile)输出到对应文件 -->
        <SpringProfile name="prod">
            <Logger name="ua.zhytariuk.planningsystem.controller" level="info">
                <appender-ref ref="CONTROLLER"/>
            </Logger>
            <Logger name="ua.zhytariuk.planningsystem.exception" level="error">
                <appender-ref ref="SERVICE"/>
            </Logger>
            <Logger name="ua.zhytariuk.planningsystem.aspect.ServiceLoggingAspect" level="trace">
                <appender-ref ref="SERVICE"/>
            </Logger>
            <Logger name="ua.zhytariuk.planningsystem.broker.kafka" level="debug">
                <appender-ref ref="KAFKA"/>
            </Logger>
            <Logger name="org.hibernate" level="debug">
                <appender-ref ref="HIBERNATE"/>
            </Logger>
            <root level="debug">
                <!-- 生产环境如果不需要控制台输出可以删掉下一行 -->
                <appender-ref ref="CONSOLE"/>
            </root>
        </SpringProfile>
    </Loggers>
</Configuration>

注意事项

  • 该方案需要项目已引入spring-boot-starter-log4j2依赖,否则<SpringProfile>标签无法识别
  • 配置中的profile名称可根据你的实际环境命名调整,比如把dev换成local、prod换成online都可以

内容的提问来源于stack exchange,提问作者Олександр Житарюк

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:39:04