
Log4j2 2.20.0 版本已正式弃用 标签中的 packages 属性,若保留该空属性将触发“package scanning is deprecated”警告;移除即可彻底消除该控制台提示,且不影响日志功能。
log4j2 2.20.0 版本已正式弃用 `
在 Log4j2 的现代配置实践中,packages 属性曾用于声明自定义插件(如 Appender、Layout、Converter)所在的 Java 包路径,以便 Log4j2 通过类路径扫描自动注册这些插件。然而,自 Log4j2 2.17.0 起,该机制已被标记为废弃(deprecated),官方明确指出:包扫描(package scanning)存在性能开销与安全风险(例如可能意外加载恶意类),且与模块化(JPMS)不兼容。因此,从 2.20.0 开始,该功能仅保留向后兼容性,将在后续主版本中被完全移除。
您当前的 log4j2.xml 中存在如下问题行:
<configuration status="warn" name="MyApp" packages=""></configuration>
尽管 packages 值为空字符串,Log4j2 仍会识别该属性并尝试执行扫描逻辑,从而触发警告:
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
✅ 正确解决方案:直接删除 packages 属性
修改后的
<configuration status="warn" name="MyApp"></configuration>
完整修正后的 log4j2.xml 示例(已移除 packages,并补充必要结构):
<?xml version="1.0" encoding="UTF-8"?><configuration status="warn" name="MyApp"><appenders><rollingfile name="RollingFile" filename="logs/app.log" filepattern="logs/app-%d{MM-dd-yyyy}.log.gz"><!-- 注意:TimeFilter 已在 Log4j2 中移除,请改用 Filters(如 TimeRangeFilter)或策略组合 --><filters><timerangefilter start="01:00:00" end="07:00:00" onmatch="ACCEPT" onmismatch="DENY"></timerangefilter></filters><patternlayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c{1.} [%t] %m%n"></patternlayout><timebasedtriggeringpolicy></timebasedtriggeringpolicy></rollingfile></appenders><loggers><root level="error"><appenderref ref="RollingFile"></appenderref></root></loggers></configuration>
⚠️ 额外注意事项:
-
TimeFilter 已被移除:您配置中使用的
是 Log4j 1.x 遗留语法,在 Log4j2 中不再支持。请改用 (如上示例),它属于标准 Filters 子节点,需置于 容器内。 -
自定义插件注册方式更新:若您确实使用了 SkyWalking、OpenTelemetry 等依赖 Log4j2 插件(如 TraceIdConverter),请确保:
- 对应 JAR(如 log4j-slf4j2-impl、skywalking-apm-toolkit-log4j-2.x)已正确引入;
- 插件类通过 @Plugin 注解 + @PluginFactory 工厂方法 实现,并由 Log4j2 自动发现(无需 packages);
- 若仍出现 "custom plugins are not properly registered" 警告(如 TraceIdConverter),说明插件 JAR 未被加载或版本不兼容,请升级至适配 Log4j2 2.20+ 的插件版本(例如 SkyWalking ≥ 9.5.0)。
- status="warn" 含义:此属性控制 Log4j2 自身内部日志的输出级别(非业务日志),设为 warn 可减少启动时冗余信息,符合生产实践。
? 验证是否生效:
清理 Maven 本地缓存(可选)、重启应用,控制台中该 StatusConsoleListener 警告将不再出现。可通过 status="debug" 临时调试确认插件加载状态,但上线前务必调回 warn 或 error。
总之,移除 packages 不仅是消除警告的快捷方式,更是拥抱 Log4j2 安全、高效、模块化演进的必要一步——精简配置、规避扫描风险、提升启动性能,一举多得。











