Log4j2配置多Appender后无日志输出问题求助
一、先排查无日志输出的直接原因
1. XML路径转义错误
你的log4j2.xml里日志路径用了\,但XML中反斜杠是转义字符,直接写logs\debug.${date:yyyy-MM-dd}.log会被解析错误,导致Log4j2找不到正确路径创建日志文件。
解决:把路径里的\改成\\(转义后),或者用跨平台的/,比如:
fileName="logs/debug.${date:yyyy-MM-dd}.log"
2. 日志目录权限问题
Tomcat的运行用户对logs目录没有读写权限,或者logs目录根本不存在,Log4j2无法创建日志文件,自然看不到输出。
解决:手动创建logs目录,给Tomcat运行用户分配该目录的读写权限。
3. 配置文件未被正确加载
确认log4j2.xml放在WEB-INF/classes目录下(Web项目的类路径根目录),如果是Maven项目,要放在src/main/resources下,打包后会自动到classes目录。
另外,可以把Configuration的status改成DEBUG,查看Tomcat启动日志里Log4j2的初始化信息,确认是否加载到配置、有没有报错:
<Configuration status="DEBUG">
4. Log4j2依赖不全
Web项目使用Log4j2需要额外引入log4j-web依赖,否则在Tomcat环境下可能无法正常初始化。如果是Maven项目,添加以下依赖:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>你的Log4j2版本</version> <scope>runtime</scope> </dependency>
同时确保项目中已经包含log4j-api和log4j-core依赖。
二、实现「日志输出到两个不同文件」的正确配置
如果你想实现:
history.log只记录INFO级别及以上的日志(比如登录成功/失败的info日志)debug.log记录DEBUG级别及以上的日志(包含info和debug日志)
可以给每个Appender添加ThresholdFilter过滤日志级别,同时将Root日志级别设为debug(确保能捕获到debug日志),完整配置如下:
<Configuration status="WARN"> <Appenders> <File name="LogHistoryFile" fileName="logs/history.${date:yyyy-MM-dd}.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <!-- 只接受INFO及以上级别日志 --> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> </File> <File name="LogDebugFile" fileName="logs/debug.${date:yyyy-MM-dd}.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <!-- 接受DEBUG及以上级别日志 --> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> </File> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="LogHistoryFile" /> <AppenderRef ref="LogDebugFile" /> </Root> </Loggers> </Configuration>
这样配置后,登录时的logger.info会同时输出到两个文件,logger.debug只会输出到debug.log,满足分文件输出的需求。
内容的提问来源于stack exchange,提问作者qwhjrfbgeegbgwdv

