如何使用属性文件配置log4j

时间:2010-02-18 13:29:58

标签: java properties log4j

如何让log4j获取属性文件。

我正在编写一个Java桌面应用程序,我想使用log4j。在我的主要方法中,如果有这个:

   PropertyConfigurator.configure("log4j.properties");

当我打开Jar时,log4j.properties文件位于同一目录中。

然而我收到了这个错误:

  

log4j:错误无法读取   配置文件[log4j.properties]。   java.io.FileNotFoundException:   log4j.properties(系统不能   找到指定的文件)

我做错了什么?

9 个答案:

答案 0 :(得分:47)

我相信configure方法需要一个绝对路径。无论如何,您还可以尝试首先加载Properties对象:

Properties props = new Properties();
props.load(new FileInputStream("log4j.properties"));
PropertyConfigurator.configure(props);

如果属性文件在jar中,那么你可以这样做:

Properties props = new Properties();
props.load(getClass().getResourceAsStream("/log4j.properties"));
PropertyConfigurator.configure(props);

以上假设log4j.properties位于jar文件的根文件夹中。

答案 1 :(得分:13)

使用PropertyConfigurator.configure( String configFilename )时, 它们是log4j库中的以下操作。

Properties props = new Properties();
FileInputStream istream = null;
try {
  istream = new FileInputStream(configFileName);
  props.load(istream);
  istream.close();
}
catch (Exception e) {
...

它读取失败,因为它从执行应用程序的当前目录中查找“Log4j.properties”。

如何更改属性文件的读取部分的方式如下,并将“log4j.properties”放在设置CLASSPATH的目录上。

ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL url = loader.getResource("log4j.properties");
PropertyConfigurator.configure(url);

存在将“Log4j.properties”放入jar文件的另一种方法。

jar xvf [YourApplication].jar log4j.properties

答案 2 :(得分:7)

只需设置-Dlog4j.configuration = file:log4j.properties为我工作。

log4j然后在应用程序的当前工作目录中查找文件 log4j.properties。

请记住,log4j.configuration是 URL 规范,因此如果要引用文件系统上的常规文件,即文件,请在log4j.properties文件名前面添加“file:”不在课堂上!

最初我指定了-Dlog4j.configuration = log4j.properties。但是,仅当log4j.properties位于类路径上时才有效。当我将log4j.properties复制到我的项目中的main / resources并重建以便将其复制到目标目录(maven项目)时,这也可以(或者你可以将log4j.properties打包到你的项目罐中,但那不会允许用户编辑记录器配置!)。

答案 3 :(得分:4)

这是@kgiannakakis的答案编辑: 原始代码错误,因为在调用Properties.load(InputStream)后它没有正确关闭InputStream。来自Javadocs:The specified stream remains open after this method returns.

================================

我相信configure方法需要一个绝对路径。无论如何,您还可以尝试首先加载Properties对象:

Properties props = new Properties();
InputStream is = new FileInputStream("log4j.properties");
try {
    props.load(is);
}
finally {
    try {
        is.close();
    }
    catch (Exception e) {
        // ignore this exception
    }
}
PropertyConfigurator.configure(props);

如果属性文件在jar中,那么你可以这样做:

Properties props = new Properties();
InputStream is = getClass().getResourceAsStream("/log4j.properties");
try {
    props.load(is);
}
finally {
    try {
        is.close();
    }
    catch (Exception e) {
        // ignore this exception
    }
}
PropertyConfigurator.configure(props);

以上假设log4j.properties位于jar文件的根文件夹中。

答案 4 :(得分:2)

我今天在我的申请中有这段代码

File log4jfile = new File("./conf/log4j.properties");
PropertyConfigurator.configure(log4jfile.getAbsolutePath());

相对路径来自JVM的工作目录(JVM启动的位置)。

答案 5 :(得分:0)

我相信它需要在java类路径中的log4j.properties目录。在您的情况下,将CWD添加到类路径应该工作。

答案 6 :(得分:0)

由于JVM参数最终作为系统变量传递给您的java程序,您可以在执行点的开头使用此代码来编辑属性,并让log4j读取您刚刚在系统属性中设置的属性

try {
        System.setProperty("log4j.configuration", new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator+"log4j.properties").toURI().toURL().toString());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

答案 7 :(得分:0)

import org.apache.log4j.PropertyConfigurator;

导入此内容,然后:

Properties props = new Properties();
InputStream is = Main.class.getResourceAsStream("/log4j.properties");

try {
    props.load(is);
} catch (Exception e) {
    // ignore this exception
    log.error("Unable to load log4j properties file.",e);
}
PropertyConfigurator.configure(props);

我的java文件目录如下:

src/main/java/com/abc/xyz

和log4j目录是这样的:

src/main/resources

答案 8 :(得分:-2)

您可以通过定义“ log4j.debug ”变量来启用log4j内部日志记录。