如何设置log4j属性文件?

2022-09-03 00:39:51

我有一个使用log4j的Eclipse Java项目。我无法将log4j配置文件设置为按文件路径访问。我必须在jar中导出并运行项目。

这是我如何尝试:

public class Wita {
  static Logger logger;
  public static void main(String[] args) {
    System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.separatorChar+"resources"+File.separatorChar+"log4j.xml" );
    // System.out.println( System.getProperty("log4j.configuration") );
    logger = Logger.getLogger(Wita.class.getName());
  }
}

系统输出输出 C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml这很好。WITA 是项目的基文件夹。但是,使用 -Dlog4j.debug 参数运行项目时,也会返回以下内容:

log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18e3e60.
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using sun.misc.Launcher$AppClassLoader@18e3e60 class loader.
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using ClassLoader.getSystemResource().
log4j: Could not find resource: [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml].

我想随着时间的推移更改log4j.xml,而无需构建另一个jar文件。我该怎么做?


答案 1

http://logging.apache.org/log4j/1.2/manual.html 的“默认初始化过程”中:

  • 将资源字符串变量设置为 log4j.configuration system 属性的值。指定默认初始化文件的首选方法是通过 log4j.configuration 系统属性。如果未定义系统属性 log4j.configuration,请将字符串变量资源设置为其默认值“log4j.properties”。
  • 尝试将资源变量转换为 URL。
  • 如果资源变量无法转换为 URL,例如由于格式错误的 URLException,则通过调用 org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) 从类路径中搜索资源,这将返回一个 URL。请注意,字符串“log4j.properties”构成了格式错误的 URL。请参阅 Loader.getResource(java.lang.String) 以获取搜索位置的列表。

因此,您需要在属性值前面附加,以便可以将其视为URL。file:log4j.configuration

请参阅 https://stackoverflow.com/a/7927278/603516

更好的代码:

    System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL());

答案 2

您可以设置虚拟机参数:-Dlog4j.configuration='path_to_log4j.xml'

或程序性 :

String logFilePath = new File(<path_to_log4j.xml>);
if (logFilePath == null || "".equalsIgnoreCase(logFilePath)) {
    URL file = this.getClass().getResource(DEFAULT_CONF);
    DOMConfigurator.configure(file);
} else {
    DOMConfigurator.configure(<default_config_file>);   
}

推荐