Log4J2:代码修改TraceFileAppender配置未生效的解决办法
问题分析与解决方案
我来帮你排查一下问题所在,你的代码里有几个关键疏漏导致修改后的Appender配置没生效,下面一步步拆解并修正:
核心问题点
旧Appender未被移除,导致双重输出
你只是给TraceFileLogger添加了新的同名Appender,但原来的旧Appender仍然绑定在Logger上,所以日志会同时被新旧两个Appender输出,你看到的其实是旧Appender的格式输出。未更新LoggerContext配置
Log4j2的配置修改后,必须主动通知上下文加载新配置,否则所有修改都不会生效。滚动文件格式错误
你设置的withFilePattern("Zuzi")是无效的命名规则,这会让SizeBasedTriggeringPolicy无法生成滚动日志文件,自然触发策略失效。
修正后的代码
修改Package1LoggingClass中的addAppender方法如下:
public void addAppender() { // 获取当前正在使用的LoggerContext(false参数避免创建新上下文) LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); // 1. 移除旧的TraceFileAppender(停止并清理引用) Appender oldAppender = config.getAppender("TraceFileAppender"); if (oldAppender != null) { oldAppender.stop(); config.removeAppender("TraceFileAppender"); // 从LoggerConfig中移除旧Appender的绑定 LoggerConfig loggerConfig = config.getLoggerConfig("TraceFileLogger"); loggerConfig.removeAppender(oldAppender.getName()); } // 2. 创建新的PatternLayout,包含[Zuraiz]标识 PatternLayout layout = PatternLayout.newBuilder() .withConfiguration(config) .withPattern("%d{HH:mm:ss.SSS} [Zuraiz] %msg%n") .build(); // 3. 创建正确配置的RollingFileAppender,修复filePattern格式 RollingFileAppender appender = RollingFileAppender.newBuilder() .setConfiguration(config) .withName("TraceFileAppender") .withLayout(layout) .withFileName("logs/TraceFile.log") // 使用符合规则的滚动文件格式,确保SizeBased策略生效 .withFilePattern("logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log") .withPolicy(SizeBasedTriggeringPolicy.createPolicy("10KB")) .build(); appender.start(); config.addAppender(appender); // 4. 将新Appender绑定到TraceFileLogger LoggerConfig loggerConfig = config.getLoggerConfig("TraceFileLogger"); loggerConfig.addAppender(appender, null, null); // 5. 关键:通知Log4j2加载新配置 ctx.updateLoggers(config); }
关键修正说明
LogManager.getContext(false):确保获取当前应用正在使用的Logger上下文,而不是初始化新的上下文,这是修改现有配置的前提。- 移除旧Appender:必须停止旧Appender并从配置和LoggerConfig中彻底移除,避免新旧Appender同时输出日志。
- 正确的
filePattern:遵循Log4j2的滚动文件命名规则,这样SizeBasedTriggeringPolicy才能正确判断何时触发文件滚动。 ctx.updateLoggers(config):这是让修改后的配置生效的核心步骤,Log4j2不会自动感知配置修改,必须手动触发更新。
预期效果
修改后再次运行代码,日志文件中会出现[Zuraiz]标识,且当日志文件达到10KB时会自动滚动生成新的日志文件。
内容的提问来源于stack exchange,提问作者Zuraiz ud din
相关产品推荐
相关产品推荐

