log4j:使用了哪个配置文件?

时间:2011-04-07 16:51:34

标签: java log4j

使用log4j,如何找出当前使用的logConfigurator文件的名称和路径,使用PropertyConfigurator.configureAndWatch方法重置文件名,该方法需要此文件的名称和路径看看它是否已经改变。

API文档向我展示了如何配置log4j以重新加载配置,但我找不到一种方法来查看自动获取的文件名和路径。 应用程序独立运行任何应用程序服务器。

感谢。

2 个答案:

答案 0 :(得分:24)

我担心您没有机会从API中获取自动拾取的路径。据我了解log4j的源代码,检测到的路径将被使用而不会被存储。

至少你可以使用-Dlog4j.debug属性在启动时输出log4j内部调试信息,你会得到一些这样的信息:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@11b86e7.
log4j: Using URL [file:/C:/develop/workspace/foobar/target/classes/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator

'log4j: Using URL ...'行来自LogManager类。您可以从此处检查初始化过程。我看到的URL不会存储以供日后使用。

答案 1 :(得分:2)

您可以在LogManager类的静态初始化中使用与log4j相同的过程。请注意其他初始化和外部配置,例如来自Spring的org.springframework.web.util.Log4jConfigListener

  public static URL getLog4jConfig() {
    String override = OptionConverter.getSystemProperty("log4j.defaultInitOverride", null);
    if (override == null || "false".equalsIgnoreCase(override)) {
      String configurationOptionStr = OptionConverter.getSystemProperty("log4j.configuration", null);

      URL url;

      if (configurationOptionStr == null) {
        url = Loader.getResource("log4j.xml");
        if (url == null) {
          url = Loader.getResource("log4j.properties");
        }
      } else {
        try {
          url = new URL(configurationOptionStr);
        } catch (MalformedURLException ex) {
          url = Loader.getResource(configurationOptionStr);
        }
      }
      return url;
    } else {
      return null;
    }
  }