LOG4J2代码配置后RollingFile Appender无法写文件 自定义插件不生效
LOG4J2编程式配置RollingFile及自定义插件无输出修复方案
核心问题原因
- 插件包扫描时机错误:
PluginManager.addPackage()需在LOG4J2上下文初始化前调用,你当前调用时机晚于插件扫描流程,导致自定义JTxtLogAppender未被注册,无效的Appender引用会干扰整体配置生效 - RollingFile配置缺失回滚策略:编程式配置下未显式声明
DefaultRolloverStrategy,会导致文件输出流初始化异常,仅创建空文件无法写入内容 - 配置初始化逻辑有误:未指定当前上下文关联新配置,默认已加载的配置会覆盖你的编程式配置,仅控制台输出生效
修复步骤
- 调整插件包扫描顺序,在所有配置逻辑前加载自定义插件包
- 给RollingFile补充
DefaultRolloverStrategy配置 - 初始化配置时指定上下文,确保配置生效
- 校验自定义Appender注解:确认
JTxtLogAppender类上@Plugin(name = "JTxtLogAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)注解配置正确,工厂方法标注@PluginFactory
修正后代码
// 第一步:最先加载自定义插件包,必须在任何LOG4J2配置初始化前执行 PluginManager.addPackage("dxc"); String logFile = logPath + "dxc.log"; String logFilePattern = logPath + "dxc-%d{yyyy-MM-dd}.log"; ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); LayoutComponentBuilder layout = builder.newLayout("PatternLayout"); layout.addAttribute("pattern", "%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c: %m%n"); AppenderComponentBuilder console = builder.newAppender("console", "Console") .add(layout); builder.add(console); ComponentBuilder triggeringPolicy = builder.newComponent("Policies") .addComponent(builder.newComponent("TimeBasedTriggeringPolicy")) .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "100M")); // 补充回滚策略配置 ComponentBuilder rolloverStrategy = builder.newComponent("DefaultRolloverStrategy") .addAttribute("max", 30); // 保留最近30个日志文件,可自行调整 AppenderComponentBuilder rollingFile = builder.newAppender("rollingFile", "RollingFile") .addAttribute("fileName", logFile) .addAttribute("filePattern", logFilePattern) .addAttribute("immediateFlush", true) .addAttribute("append", true) .addComponent(triggeringPolicy) .addComponent(rolloverStrategy) // 加入回滚策略 .add(layout); builder.add(rollingFile); AppenderComponentBuilder jTxtAppender = builder.newAppender("jTxtLogAppender", "JTxtLogAppender") .add(layout); builder.add(jTxtAppender); RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.INFO) .add(builder.newAppenderRef("console")) .add(builder.newAppenderRef("rollingFile")) .add(builder.newAppenderRef("jTxtLogAppender")); builder.add(rootLogger); // 修正初始化逻辑,显式替换当前上下文配置 BuiltConfiguration config = builder.build(); Configurator.reconfigure(config); Configurator.setRootLevel(Level.INFO);
额外校验点
- 确认
logPath路径末尾包含路径分隔符(/或\,依操作系统而定),避免生成的日志文件路径异常 - 运行时添加LOG4J2调试参数
-Dlog4j2.debug=true,查看启动日志中是否有Appender初始化失败的报错信息,可快速定位自定义插件的配置问题
内容的提问来源于stack exchange,提问作者viglu
相关产品推荐
相关产品推荐

