Log4j2配置文件输出日志无效,日志全输出至控制台且生成文件大小为0
配置问题排查定位
结合你描述的「空日志文件已创建、所有日志输出到控制台」的现象,本质是Log4j2仅完成了配置的Appender实例初始化阶段,但后续Logger与Appender的绑定流程完全中断,最终回退到默认的控制台输出逻辑。常见触发原因按出现概率从高到低排列:
- 缺少AsyncLogger必需的运行依赖
- 你在配置中全量使用
<AsyncLogger>标签,Log4j2的异步日志能力不是核心包默认内置的功能,必须额外引入两个匹配版本的依赖:- 引入无锁缓冲区实现包
com.lmax:disruptor - 确保Log4j2版本与Disruptor版本兼容(2.10+版本的Log4j2对应3.4.x版本的Disruptor)
- 引入无锁缓冲区实现包
- 缺少该依赖时,Log4j2在解析
<AsyncLogger>节点时会抛出插件类找不到的错误,直接中断后续的Logger绑定流程,最终回退到默认控制台配置,完全匹配你遇到的现象。
- 你在配置中全量使用
- 配置解析存在无法识别的节点导致流程中断
- 你在配置中开启了
status="trace",Log4j2自身的解析过程日志会直接打印在控制台,你可以顺着控制台日志向上查找第一处ERROR级别的解析报错,常见触发点包括:- 低版本Log4j2不识别自定义pattern中的
%rEx异常表达式 - 版本过老的Log4j2不支持
RollingRandomAccessFile这类高性能文件Appender
- 低版本Log4j2不识别自定义pattern中的
- 你在配置中开启了
- 组合配置的逻辑缺陷放大了空文件的错觉
- 你同时配置了
immediateFlush="false"(关闭单条日志写入时的即时刷盘)和shutdownHook="disable"(关闭JVM退出时的日志刷盘钩子):就算Appender绑定成功,所有日志都会暂存在内存缓冲区中,既不会实时写入文件,程序退出时也不会主动触发刷盘,必须等内存缓冲区写满(默认8KB)才会落盘,很容易被误认为文件一直是0大小。
- 你同时配置了
- 过滤器逻辑的误杀风险
- 你给
service、all两个Appender配置的过滤器逻辑为level="ERROR" onMatch="DENY",也就是所有级别>=ERROR的日志都会被直接拒绝写入文件。如果当前程序运行时输出的日志全部是ERROR/FATAL级别,就算配置绑定成功,也不会有任何内容写入这两个文件,只会通过fallback的控制台通道输出。
- 你给
修复步骤
- 先排查控制台输出的Log4j2 trace解析日志,定位第一处报错,80%的场景都是因为缺少Disruptor依赖
- 临时关闭高性能配置参数做验证:移除
shutdownHook="disable"属性、把所有Appender的immediateFlush改成true,确认日志可以正常落盘后,再调回高性能参数 - 校验过滤器逻辑,确保业务需要的日志级别不会被拦截
内容的提问来源于stack exchange,提问作者user15045220
相关产品推荐
相关产品推荐

