配置log4j2.xml后Spring Boot自定义日志无法输出至控制台
问题排查与解决方案
1. 修正日志依赖配置
绝对不要用spring-boot-starter-log4j,这是对应log4j 1.x的旧版依赖,本身存在安全漏洞,Spring Boot 2.x+官方推荐使用spring-boot-starter-log4j2。
在你的构建文件中,确保正确引入log4j2 starter,同时彻底排除所有依赖中的spring-boot-starter-logging:
Maven示例:
<!-- 引入log4j2官方starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- Camel Starter排除默认日志组件 --> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- Web Starter排除默认日志组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
Gradle示例:
// 引入log4j2官方starter implementation 'org.springframework.boot:spring-boot-starter-log4j2' // Camel Starter排除默认日志组件 implementation('org.apache.camel.springboot:camel-spring-boot-starter') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } // Web Starter排除默认日志组件 implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' }
2. 检查log4j2.xml的Logger配置
框架日志正常但业务日志不输出,90%的概率是业务代码所在包未配置对应日志级别。
假设你的业务代码在com.example.biz包下,需要在log4j2.xml中添加针对性配置:
<!-- 业务包日志配置 --> <Logger name="com.example.biz" level="info" additivity="false"> <AppenderRef ref="Console"/> <!-- 如果有文件输出需求,添加对应的Appender引用 --> <AppenderRef ref="FileAppender"/> </Logger> <!-- 根Logger负责框架类日志输出 --> <Root level="info"> <AppenderRef ref="Console"/> </Root>
注意:
name需严格匹配业务代码的包路径,可直接用根包(如com.example)覆盖整个项目level不能高于你业务日志使用的级别(比如用LOG.info就不能设为warn)additivity="false"避免日志被根Logger重复输出
3. 验证OpenTelemetry与log4j2的集成
因为你是为了集成OpenTelemetry,需确保log4j2的OTel扩展依赖已正确引入:
<dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-log4j-2.17-appender</artifactId> <version>1.32.0</version> <!-- 使用与你的OTel版本匹配的稳定版 --> </dependency>
同时在log4j2.xml中配置OTel Appender,并关联到业务Logger:
<Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg %ex %n"/> </Console> <!-- OpenTelemetry日志采集Appender --> <OpenTelemetry name="OpenTelemetry"> <PatternLayout pattern="%msg"/> </OpenTelemetry> </Appenders> <Logger name="com.example.biz" level="info" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="OpenTelemetry"/> </Logger>
4. 排查依赖冲突
用依赖分析工具检查是否有残留的冲突日志组件(如logback、slf4j旧绑定):
Maven命令:
mvn dependency:tree -Dincludes=org.slf4j,ch.qos.logback,log4j
Gradle命令:
./gradlew dependencies --configuration runtimeClasspath | grep -E 'slf4j|logback|log4j'
如果发现logback-classic或slf4j-log4j12这类依赖,直接在对应的dependency块中排除。
5. 验证Logger实例获取方式
确保业务代码中使用SLF4J标准API获取Logger:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class BizService { private static final Logger LOG = LoggerFactory.getLogger(BizService.class); public void execute() { LOG.info("业务日志测试输出"); } }
如果直接使用log4j2 API,需确保通过org.apache.logging.log4j.LogManager.getLogger()获取实例(spring-boot-starter-log4j2已包含所需API依赖)。
内容的提问来源于stack exchange,提问作者p23he
相关产品推荐
相关产品推荐

