使用LoggerContext指定log4j2.xml路径时,如何消除配置文件未找到错误日志?
解决Log4j2手动指定配置文件时的初始化错误
这个问题我之前也碰到过,本质是Log4j2的初始化时机优先于你手动指定配置的代码:它启动时会默认去类路径下查找log4j2.xml这类配置文件,找不到就会输出那条错误日志——哪怕你之后手动设置了正确的配置路径,初始化阶段的“找不到”记录已经打出来了。
下面给你几个实用的解决办法,按需选择:
方法1:提前通过系统属性指定配置路径
在Log4j2开始初始化之前(也就是获取Logger或者调用LogManager之前),先设置log4j.configurationFile系统属性,让它从一开始就知道该去哪里找配置文件。
两种设置方式:
JVM启动参数:在Eclipse的运行配置里,给VM参数加上:
-Dlog4j.configurationFile=file:./resources/log4j2.xml(建议用相对路径的标准写法,避免Windows路径的转义问题)
代码开头设置:在main方法的第一行就执行属性设置,确保在任何Log4j2相关操作之前完成:
public static void main(String[] args) { // 先设置系统属性,指定配置文件路径 File configFile = new File("./resources/log4j2.xml"); System.setProperty("log4j.configurationFile", "file:" + configFile.getAbsolutePath()); // 之后再获取Logger和操作LoggerContext LoggerContext context = (org.apache.logging.log4j.core.LoggerContext)LogManager.getContext(false); // 这里甚至可以不用再调用setConfigLocation了,系统属性已经指定了配置源 org.apache.logging.log4j.Logger LOG = LogManager.getLogger(Log4j2Example.class); LOG.debug("This Will Be Printed On Debug"); // ... 其他日志代码 }
方法2:用Configurator类直接初始化配置
Log4j2提供了org.apache.logging.log4j.core.config.Configurator工具类,它可以直接跳过默认的配置查找流程,用你指定的配置文件完成初始化,从根源上避免那条错误日志。
修改后的代码示例:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; import java.io.File; public class Log4j2Example { public static void main(String[] args) { // 先通过Configurator初始化配置 File configFile = new File("./resources/log4j2.xml"); Configurator.initialize(null, configFile.toURI().toString()); // 再获取Logger Logger LOG = LogManager.getLogger(Log4j2Example.class); LOG.debug("This Will Be Printed On Debug"); LOG.info("This Will Be Printed On Info"); LOG.warn("This Will Be Printed On Warn"); } }
这个方法比手动操作LoggerContext更简洁,也更符合Log4j2的推荐用法。
方法3:将配置文件放在类路径下(你已验证的方案)
如果你的配置路径不需要动态调整,直接把log4j2.xml放到Eclipse的src/main/resources目录下(或者其他类路径目录),Log4j2初始化时就能直接找到,自然不会报错。这个适合配置固定的场景。
内容的提问来源于stack exchange,提问作者user3890872
相关产品推荐
相关产品推荐

