如何从指定Spring Profile中排除log4j2.xml实现分环境日志输出
实现方案
你可以通过以下两种保留XML配置的方式实现不同Spring Profile对应不同日志输出策略,无需移除原XML文件:
方案1:多配置文件按Profile区分
Spring Boot支持为不同Profile指定独立的Log4j2配置文件,操作步骤如下:
- 在
src/main/resources目录下创建两份XML配置:- 开发环境配置
log4j2-dev.xml:仅保留控制台输出相关的Appender、Logger配置 - 生产环境配置
log4j2-prod.xml:保留你当前的滚动文件输出配置
- 开发环境配置
- 在对应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,提问作者Олександр Житарюк
相关产品推荐
相关产品推荐

