You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LOG4J2代码配置后RollingFile Appender无法写文件 自定义插件不生效

LOG4J2编程式配置RollingFile及自定义插件无输出修复方案

核心问题原因

  • 插件包扫描时机错误:PluginManager.addPackage() 需在LOG4J2上下文初始化前调用,你当前调用时机晚于插件扫描流程,导致自定义JTxtLogAppender未被注册,无效的Appender引用会干扰整体配置生效
  • RollingFile配置缺失回滚策略:编程式配置下未显式声明DefaultRolloverStrategy,会导致文件输出流初始化异常,仅创建空文件无法写入内容
  • 配置初始化逻辑有误:未指定当前上下文关联新配置,默认已加载的配置会覆盖你的编程式配置,仅控制台输出生效

修复步骤

  1. 调整插件包扫描顺序,在所有配置逻辑前加载自定义插件包
  2. 给RollingFile补充DefaultRolloverStrategy配置
  3. 初始化配置时指定上下文,确保配置生效
  4. 校验自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:18:00