Log4j2自定义Logger生成空日志文件问题求助
Log4j2自定义Logger不生效问题排查
问题描述
运行Log4j2示例程序时,程序能创建logs/app.log文件但内容为空;取消注释配置中的<Root>Logger后,日志可正常写入,但自定义的<Logger>(name为com.myapp)始终无法生效。
相关代码与配置
log4j2配置文件
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="DEBUG"> <Appenders> <File name="LogToFile" fileName="logs/app.log"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> </File> </Appenders> <Loggers> <Logger name="com.myapp" level="debug" additivity="false"> <AppenderRef ref="LogToFile"/> </Logger> <!--<Root level="debug"> <AppenderRef ref="LogToFile"/> </Root> --> </Loggers> </Configuration>
Java代码
package com.lab; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class HelloWorld { private static final Logger logger = LogManager.getLogger(HelloWorld.class); public static void main(String[] args) { logger.debug("Hello from Log4j 2"); logger.info("Hello from Log4j 2"); logger.error("Hello from Log4j 2"); } }
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>test</groupId> <artifactId>test.log4j2</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <log4j.version>2.18.0</log4j.version> <disruptor.version>3.4.2</disruptor.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>com.lab.HelloWorld</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
问题原因
核心问题是自定义Logger的name与日志所属类的包路径不匹配:
- Java代码中,日志所属类
HelloWorld位于com.lab包下,通过LogManager.getLogger(HelloWorld.class)获取的Logger,其名称为com.lab.HelloWorld。 - 配置文件中自定义Logger的name是
com.myapp,这个Logger只会处理包路径以com.myapp开头的类的日志,完全匹配不到com.lab下的类。 - 当
<Root>Logger被注释时,没有任何Logger能匹配到com.lab.HelloWorld的日志请求,因此日志无法输出,文件为空;启用<Root>后,所有未匹配到自定义Logger的日志都会走Root,所以日志能正常写入。
解决方案
只需将配置文件中自定义Logger的name修改为与类包匹配的值即可,有两种可选方式:
- 精确匹配
com.lab包:
<Logger name="com.lab" level="debug" additivity="false"> <AppenderRef ref="LogToFile"/> </Logger>
- 匹配整个
com父包(如果需要覆盖com下所有子包的日志):
<Logger name="com" level="debug" additivity="false"> <AppenderRef ref="LogToFile"/> </Logger>
修改后,自定义Logger就能正确捕获com.lab.HelloWorld的日志请求,无需启用Root也能正常输出日志到文件。
内容的提问来源于stack exchange,提问作者Kay Gee
相关产品推荐
相关产品推荐

