2011-05-20 66 views
3

中选择其配置有没有办法找出Log4J从哪里挑选配置文件? 我试图更改我的log4j.xml,并且这些更改未反映在Log4j行为中。我删除了log4j.xml,有趣的是,Log4J仍然在处理旧的行为。所以它必须选择一些在我的命名空间中可用的配置文件。但问题是我怎样才能找出哪一个。有没有办法做到这一点?有很多不同的jar文件依赖关系,所以它们中的一个必须包含一个log4j.xml或log4j.properties来覆盖我的更改。 任何想法?如何知道Log4j在何处从

回答

7

运行应用程序时,您可以设置系统属性-Dlog4j.debug。 log4j的会产生调试输出在这种情况下,告诉你它是如何解析到的log4j.xml的路径,例如:

log4j: Trying to find [log4j.xml] using context classloader [email protected]e7. 
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 

要设置的路径明确使用的系统属性-Dlog4j.configuration=file:c:/pathToFile描述here

0

激活-Dlog4j.debug就像FrVaBe建议的his answer是一个很好的解决方案。但是,我想在启动时打印或记录位置,而不激活log4j的调试模式。我创建了一个小的util方法,它主要是log4j的默认init例程的副本,它返回配置文件的URL。

也许这是对别人有用:

/** 
* Get the URL of the log4j config file. This is mostly copied from org.apache.log4j.LogManager's default init routine. 
* 
* @return log4j config url 
*/ 
public static URL getLog4JConfigurationUrl(){ 

    /** Search for the properties file log4j.properties in the CLASSPATH. */ 
    String override = OptionConverter.getSystemProperty(LogManager.DEFAULT_INIT_OVERRIDE_KEY, null); 

    // if there is no default init override, then get the resource 
    // specified by the user or the default config file. 
    if (override == null || "false".equalsIgnoreCase(override)){ 

     String configurationOptionStr = OptionConverter.getSystemProperty(LogManager.DEFAULT_CONFIGURATION_KEY, null); 

     URL url; 

     // if the user has not specified the log4j.configuration 
     // property, we search first for the file "log4j.xml" and then 
     // "log4j.properties" 
     if (configurationOptionStr == null){ 
     url = Loader.getResource("log4j.xml"); 
     if (url == null){ 
      url = Loader.getResource(LogManager.DEFAULT_CONFIGURATION_FILE); 
     } 
     } else { 
     try { 
      url = new URL(configurationOptionStr); 
     } catch (MalformedURLException ex) { 
      // so, resource is not a URL: 
      // attempt to get the resource from the class path 
      url = Loader.getResource(configurationOptionStr); 
     } 
     } 

     if (url == null) 
     throw new RuntimeException("log4j configuration could not be found!"); 

     return url; 
    } 

    throw new RuntimeException("default init is overridden, log4j configuration could not be found!"); 
    } 

PS:如果你知道一种方式来问log4j来进行它目前使用的配置文件,让我知道。