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

Spring Boot中Log4j2+SLF4J自定义日志无法输出问题求助

Spring Boot Log4j2+SLF4J自定义日志无输出问题修复

问题现象

在Spring Boot应用中配置Log4j2搭配SLF4J后,控制台和文件日志仅输出Spring Boot相关内容,自定义日志完全不显示;移除spring-boot-starter-web中对spring-boot-starter-logging的排除后,自定义日志能输出,但文件日志功能失效。

核心原因

  1. SLF4J绑定依赖仅在测试环境生效:log4j-slf4j18-impl的scope设为test,主程序运行时没有SLF4J到Log4j2的绑定,自定义日志找不到正确的实现渠道。
  2. 默认日志框架未完全排除:除了spring-boot-starter-web,spring-boot-starter-data-jpa、spring-boot-starter-security等starter也依赖spring-boot-starter-logging(默认用Logback),只排除web模块的默认日志会导致框架冲突,日志路由混乱。

修复步骤

1. 修正Maven依赖配置

推荐直接使用Spring Boot官方的Log4j2 Starter,自动处理版本兼容和依赖绑定,同时统一排除所有starter中的默认日志:

<dependencies>
    <!-- 数据JPA Starter,排除默认日志 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</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>

    <!-- Security Starter,排除默认日志 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- 引入Spring Boot Log4j2 Starter,自动包含log4j-api、core和SLF4J绑定 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

    <!-- 保留其他原有依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
    <dependency>
        <groupId>commons-validator</groupId>
        <artifactId>commons-validator</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>32.1.3-jre</version>
    </dependency>
</dependencies>

2. 调整Log4j2配置(可选优化)

确保log4j2.xml放在src/main/resources目录下,若需要给自定义代码单独配置日志级别,可添加包级Logger,同时修正原配置中的日期格式错误:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="true" append="false">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <!-- 自定义代码所在包,比如com.example,设置日志级别 -->
        <Logger name="com.example" level="info" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="MyFile"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

3. 验证自定义日志代码

确保代码中正确使用SLF4J Logger:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomController {
    private static final Logger logger = LoggerFactory.getLogger(CustomController.class);

    @GetMapping("/test-log")
    public String testLog() {
        logger.info("这是自定义Info日志");
        logger.debug("这是自定义Debug日志");
        return "日志测试完成";
    }
}

4. 清理依赖缓存

执行mvn clean install命令,清理旧的依赖缓存,避免冲突jar包残留。

内容的提问来源于stack exchange,提问作者Anirudh Gambhir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:24:54