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

配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:13:15