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

Spring Boot中log4j2.xml未生效,无法生成分目录日志求助

问题

在Spring Boot 3.1.3中使用log4j-core实现日志功能,用application.properties配置时能正常生成错误日志,但切换到log4j2.xml配置后,errorlogs和generallogs目录下均无日志生成。需求是生成两个独立日志文件,分别存储错误日志和普通日志,相关配置及依赖如下:

application.properties配置

# Set the logging level for Spring Framework to ERROR
logging.level.com.crystalbi.push_notifications = INFO

# Define the log file location and log pattern
logging.file.name = errorlogs/error-logs.log 
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
logging.logback.rollingpolicy.max-file-size = 1GB

log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <!-- General Logs Appender -->
        <RollingFile name="GeneralLog" fileName="generalLogs/app.log" filePattern="generalLogs/app-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
        </RollingFile>
        
        <!-- Error Logs Appender -->
        <RollingFile name="ErrorLog" fileName="errorlogs/error.log" filePattern="errorlogs/error-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    
    <Loggers>
        <Logger name="com.mkyong" level="INFO" additivity="false">
            <AppenderRef ref="GeneralLog"/>
            <AppenderRef ref="LogToConsole"/>
        </Logger>
        <Logger name="org.springframework.boot" level="ERROR" additivity="false">
            <AppenderRef ref="ErrorLog"/>
            <AppenderRef ref="LogToConsole"/>
        </Logger>
        <Root level="ERROR">
            <AppenderRef ref="GeneralLog"/>
            <AppenderRef ref="ErrorLog"/>
            <AppenderRef ref="LogToConsole"/>
        </Root>
    </Loggers>
</Configuration>

Maven依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
</dependency>

问题分析与解决方案

核心问题

  1. 依赖不完整:Spring Boot默认使用Logback,仅引入log4j-core无法完成日志框架替换,缺少Spring Boot与Log4j2的集成依赖,且未排除Logback。
  2. Logger名称不匹配:配置中Logger的name为com.mkyong,与业务代码包com.crystalbi.push_notifications不符,导致业务日志无法被捕获。
  3. Root Logger级别限制:Root级别设为ERROR,INFO级别的普通日志无法进入GeneralLog。
  4. RollingFile无滚动策略:仅定义filePattern但未设置触发条件,可能导致日志无法正常写入。

修正步骤

1. 调整Maven依赖

排除Logback,引入Spring Boot Log4j2集成包:

<dependencies>
    <!-- 排除默认Logback依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 引入Log4j2集成依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>

2. 修正log4j2.xml配置

匹配业务包、调整日志级别、添加滚动策略:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <!-- 普通日志:捕获INFO及以上,排除ERROR -->
        <RollingFile name="GeneralLog" fileName="generalLogs/app.log" filePattern="generalLogs/app-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <!-- 1GB滚动策略 -->
            <SizeBasedTriggeringPolicy size="1GB"/>
            <!-- 保留最多10个滚动文件 -->
            <DefaultRolloverStrategy max="10"/>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        
        <!-- 错误日志:仅捕获ERROR及以上 -->
        <RollingFile name="ErrorLog" fileName="errorlogs/error.log" filePattern="errorlogs/error-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <SizeBasedTriggeringPolicy size="1GB"/>
            <DefaultRolloverStrategy max="10"/>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    
    <Loggers>
        <!-- 业务包日志配置 -->
        <Logger name="com.crystalbi.push_notifications" level="INFO" additivity="false">
            <AppenderRef ref="GeneralLog"/>
            <AppenderRef ref="LogToConsole"/>
        </Logger>
        <!-- Spring Boot错误日志 -->
        <Logger name="org.springframework.boot" level="ERROR" additivity="false">
            <AppenderRef ref="ErrorLog"/>
            <AppenderRef ref="LogToConsole"/>
        </Logger>
        <!-- Root日志级别设为INFO,确保未匹配日志被处理 -->
        <Root level="INFO">
            <AppenderRef ref="GeneralLog"/>
            <AppenderRef ref="ErrorLog"/>
            <AppenderRef ref="LogToConsole"/>
        </Root>
    </Loggers>
</Configuration>

3. 清理application.properties日志配置

移除所有日志相关配置,避免与log4j2.xml冲突:

# 删除以下配置
# logging.level.com.crystalbi.push_notifications = INFO
# logging.file.name = errorlogs/error-logs.log 
# logging.pattern.console=...
# logging.pattern.file=...
# logging.logback.rollingpolicy.max-file-size = 1GB

验证要点

  • 确保generalLogs和errorlogs目录存在(Log4j2会自动创建,手动创建更稳妥)
  • 业务代码中使用org.apache.logging.log4j.Logger或Spring日志抽象org.slf4j.Logger均可
  • 测试INFO、ERROR级日志输出,确认分别写入对应文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:41:15