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

Spring Boot中Log4j2日志文件未生成问题求助

Spring Boot Log4j2多文件日志输出问题排查与修复

我在为Spring Boot应用配置Log4j2日志框架,希望将日志分别输出到独立的info和error日志文件中,但目前日志只输出到控制台,已经检查过user_dir确认路径没问题。

测试日志代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class UsersController {

    @Autowired
    UsersService userService;

    private static final Logger logger = LogManager.getLogger(UsersController.class);
    @PostMapping("CreateUserWithEmailAndPassword")
    public void createUserWithEmailAndPassword(@RequestParam String userName, @RequestParam String password, @RequestParam String email, HttpServletResponse response) throws ExecutionException, InterruptedException {
        logger.info("creating a new user");
        if(userService.createUserWithEmailAndPassword(userName, password, email))
            response.setStatus(HttpServletResponse.SC_ACCEPTED);
        else{
            logger.error("failed on creating a new user");
            response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
        }

    }
}

原log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="FileAppender" ref="infoAppender" fileName="info-${date:yyyyMMdd}.log" immediateFlush="true" append="true">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <File name="FileAppender" ref="errorAppender" fileName="error_warn-${date:yyyyMMdd}.log" immediateFlush="true" append="true">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="warn">
            <AppenderRef ref="errorAppender"/>
        </Root>
        <AppenderRef ref="ConsoleAppender"/>
        <AppenderRef ref="infoAppender" level="info"/>
    </Loggers>

    <Properties>
        <!--LINUX LOG DIRECTORY-->
        <Property name="logDirLinux">/storage1/user/logs/folderName/</Property>

        <!--WINDOWS LOG DIRECTORY-->
        <Property name="logDirWindows">C:\logs\</Property>

    </Properties>

</Configuration>

原build.gradle配置

plugins {
    id 'org.springframework.boot' version '2.7.2'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
}

group = 'com.Itamarled'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation ('org.springframework.boot:spring-boot-starter-web'){
        exclude group : 'spring-boot-starter-logging'
    }
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation ('org.springframework.boot:spring-boot-starter-test'){
        exclude group : 'spring-boot-starter-logging'
    }
    implementation 'com.google.firebase:firebase-admin:9.0.0'
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}

tasks.named('test') {
    useJUnitPlatform()
}

问题分析

原log4j2.xml存在多处配置错误,导致文件日志无法生成:

  1. Appender标识错误:两个File Appender的name都设为FileAppender,且错误使用ref属性(ref是引用其他Appender时使用的,不是定义Appender的属性),Log4j无法识别infoAppender和errorAppender这两个不存在的Appender。
  2. Loggers结构错误:AppenderRef不能直接作为Loggers的子节点,必须嵌套在Root或自定义Logger节点内。
  3. 日志级别配置不合理:Root级别设为warn,会忽略info级别的日志,且没有为info日志配置正确的捕获规则。
  4. 未使用定义的路径属性:Properties中定义的日志路径变量未在fileName中引用,日志默认生成在项目根目录。

修正后的log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <!-- LINUX LOG DIRECTORY -->
        <Property name="logDirLinux">/storage1/user/logs/folderName/</Property>
        <!-- WINDOWS LOG DIRECTORY -->
        <Property name="logDirWindows">C:\logs\</Property>
        <!-- 根据操作系统自动选择日志目录 -->
        <Property name="logDir">${sys:os.name.toLowerCase().contains('win') ? ${logDirWindows} : ${logDirLinux}}</Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <!-- 定义info级日志文件Appender -->
        <File name="infoAppender" fileName="${logDir}info-${date:yyyyMMdd}.log" immediateFlush="true" append="true">
            <!-- 过滤仅保留info及以上、低于warn的日志 -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <!-- 定义warn/error级日志文件Appender -->
        <File name="errorAppender" fileName="${logDir}error_warn-${date:yyyyMMdd}.log" immediateFlush="true" append="true">
            <!-- 过滤仅保留warn及以上的日志 -->
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>

    <Loggers>
        <!-- Root日志级别设为info,确保能捕获所有info及以上日志 -->
        <Root level="info">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="infoAppender"/>
            <AppenderRef ref="errorAppender"/>
        </Root>
    </Loggers>
</Configuration>

修正说明

  • 给每个File Appender设置唯一的name,去掉错误的ref属性,确保AppenderRef能正确引用。
  • 添加ThresholdFilter实现日志分级输出,避免不同级别的日志混存。
  • 使用${logDir}动态适配不同操作系统的日志路径,也可直接指定固定路径。
  • 调整Root级别为info,并将所有Appender嵌套在Root节点下,符合Log4j2的配置规范。

验证

重启应用后调用接口,检查对应日志目录下是否生成info-日期.log和error_warn-日期.log文件,同时控制台仍会输出所有日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:19:00