log4j2日志不输出的四大主因:配置文件路径错误、root logger级别过高、rollingfileappender的filepattern配置不当、asynclogger未正确启用;需严格校验classpath位置、level大小写与优先级、pattern与触发策略匹配、异步参数设置。

Log4j2.xml 文件放错位置导致日志不输出
Log4j2 启动时默认只在 classpath 根路径下找 log4j2.xml,不是“随便放个 XML 就行”。常见错误是把它丢进 src/main/resources 以外的目录,或者打包后没落在 JAR 的根目录里。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 确认文件最终是否在 JAR/WAR 的顶层(解压看看有没有
log4j2.xml直接在根目录) - Maven 项目必须放在
src/main/resources/log4j2.xml,IDEA 中还要检查Build → Build Artifacts是否包含该文件 - 启动时加 JVM 参数
-Dlog4j.configurationFile=xxx.xml可指定路径,但仅限调试,别在生产硬编码绝对路径 - 如果用了 Spring Boot,优先用
application.properties配置logging.config=classpath:log4j2.xml,避免和 Spring Boot 自带日志机制冲突
root logger 级别设太高,debug 日志全被过滤掉
RootLogger 的 level 是全局开关,设成 INFO 就意味着所有 DEBUG、TRACE 日志直接被丢弃,连 appender 都不会调用。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 开发环境 root level 建议设为
DEBUG,再靠具体Logger配置细化控制(比如<logger name="com.example.service" level="WARN"></logger>) - 不要只改某个 appender 的 level(如
ConsoleAppender),它只影响输出,不改变日志是否被记录 - 注意大小写:
debug不生效,必须是DEBUG - 如果看到
No appenders could be found for logger这类警告,大概率是 root logger 没配,或 level 为OFF
RollingFileAppender 的 filePattern 导致归档失败
filePattern 决定滚动后文件名怎么生成,但它不只是“格式字符串”——Log4j2 会根据这个 pattern 解析时间窗口、匹配历史文件。写错就无法归档,磁盘爆满。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Windows 下路径分隔符必须用正斜杠
/或双反斜杠\,单反斜杠是转义符,filePattern="logs/app-%d{yyyy-MM-dd}-%i.log"才对 - 日期格式必须和
TimeBasedTriggeringPolicy的interval匹配:比如用%d{yyyy-MM-dd-HH}就得配interval="1"和modulate="true" - 如果用
%i做序号滚动,必须同时配SizeBasedTriggeringPolicy,否则 %i 永远是 0 - 测试归档:手动触发一次滚动(
LoggerContext.reconfigure()或删掉当前日志文件),看新文件是否按 pattern 命名并出现在目标目录
异步日志(AsyncLogger)没生效,还是阻塞主线程
加了 AsyncLogger 却发现接口响应变慢,往往是因为没关掉 includeLocation="true",或者用了不兼容的 appender。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 必须在
Configuration标签加属性status="warn" monitorInterval="30",且确保 Log4j2 版本 ≥ 2.6(2.17+ 更稳) - 禁用堆栈追踪:
includeLocation="false"(默认 true),否则每次打日志都要抓线程栈,异步优势全没了 - 别把
ConsoleAppender套进 AsyncLogger —— 控制台输出本身是同步 I/O,会拖慢整个异步队列 - 验证是否真异步:在业务代码中打日志后立刻抛异常,看日志是否仍写入(异步模式下会继续刷完缓冲区)










