Log4j2生成空日志文件问题求助:Log4j迁移后日志文件创建但无内容(WebSphere 9.0非Maven项目)
Log4j2 日志文件创建但无内容的排查与解决方案
我来帮你梳理下这个问题——日志文件能正常创建却没有内容,大概率是LoggerContext的关联逻辑或者配置加载环节出了问题。结合你的代码、配置以及WebSphere环境,给你几个具体的排查方向和解决思路:
一、先检查自定义配置加载的Java代码问题
你的配置加载代码存在明显的逻辑漏洞,这很可能是核心原因:
File file = new File(log4Jcfg); ConfigurationFactory factory = XmlConfigurationFactory.getInstance(); ConfigurationSource configurationSource = new ConfigurationSource(new FileInputStream(new File(log4Jcfg))); Configuration configuration = factory.getConfiguration(context, configurationSource); context = new LoggerContext("JournalDevLoggerContext"); context.start(configuration);
这里的问题点:
- 你新建了
LoggerContext,但没有把它和业务代码中使用的Logger关联起来。默认情况下,LogManager.getLogger(YourClass.class)会使用Log4j2自带的默认上下文,而不是你自定义的这个JournalDevLoggerContext,导致日志根本不会走你配置的Appender。 - 代码中
factory.getConfiguration(context, configurationSource)里的初始context变量如果是默认上下文或null,后续新建的context并没有继承这个配置的关联关系。
修正后的代码示例:
// 加载配置文件 ConfigurationSource source = new ConfigurationSource(new FileInputStream(new File(log4Jcfg))); // 创建自定义上下文并关联配置 LoggerContext customContext = new LoggerContext("MyAppContext"); Configuration config = XmlConfigurationFactory.getInstance().getConfiguration(customContext, source); customContext.start(config); // 方式1:直接从自定义上下文获取Logger(推荐) Logger logger = customContext.getLogger(YourBusinessClass.class); logger.debug("测试日志内容"); // 方式2:将自定义上下文设置为全局上下文(适合全项目统一使用) LogManager.setContext(customContext, false); Logger globalLogger = LogManager.getLogger(YourBusinessClass.class); globalLogger.info("全局上下文测试日志");
二、验证配置文件本身是否有效
虽然文件能创建,但可以做几个小测试确认配置逻辑:
- 临时添加Console输出:修改
Loggers节点,把控制台Appender关联到Root Logger,看看WebSphere的SystemOut.log里有没有日志输出:
<Loggers> <Root level="debug"> <AppenderRef ref="archive"/> <AppenderRef ref="screen"/> <!-- 临时添加控制台输出 --> </Root> </Loggers>
如果控制台能看到日志,说明配置本身是正常的,问题回到LoggerContext的关联上;如果控制台也没日志,说明配置没被正确加载。
2. 检查系统变量与权限:虽然文件能创建,但可以确认${sys:ENTORNO}和${sys:cloneId}在WebSphere中是否正确设置(比如通过JVM参数-DENTORNO=xxx),同时确保进程对日志目录有持续写入权限(文件能创建不代表后续写入无问题)。
3. 开启Log4j2自身调试日志:把配置文件的status="warn"改成status="debug",这样Log4j2会输出自身的加载日志到控制台,你可以看到配置是否被正确解析、Appender是否被关联到Root Logger。
三、WebSphere 9环境的特殊注意事项
WebSphere自带日志框架,很容易和Log4j2产生类加载冲突:
- 确认依赖包完整性:确保你的项目
WEB-INF/lib下包含完整的Log4j2核心包:log4j-api-*.jar、log4j-core-*.jar,不要依赖WebSphere的共享库。 - 修改类加载策略:在WebSphere的应用部署设置中,把类加载器策略改为PARENT_LAST,让项目优先加载自身的Log4j2类,避免和WebSphere自带的日志类冲突。
四、快速排查步骤总结
- 修正LoggerContext的关联代码,确保业务代码使用的Logger来自自定义上下文。
- 临时添加Console Appender,验证配置是否生效。
- 开启Log4j2的status debug,查看配置加载的详细日志。
- 检查WebSphere的类加载策略和依赖包完整性。
内容的提问来源于stack exchange,提问作者Muffinous
相关产品推荐
相关产品推荐

