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存在多处配置错误,导致文件日志无法生成:
- Appender标识错误:两个File Appender的
name都设为FileAppender,且错误使用ref属性(ref是引用其他Appender时使用的,不是定义Appender的属性),Log4j无法识别infoAppender和errorAppender这两个不存在的Appender。 - Loggers结构错误:
AppenderRef不能直接作为Loggers的子节点,必须嵌套在Root或自定义Logger节点内。 - 日志级别配置不合理:Root级别设为
warn,会忽略info级别的日志,且没有为info日志配置正确的捕获规则。 - 未使用定义的路径属性: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
相关产品推荐
相关产品推荐

