如何让log4j获取属性文件。
我正在编写一个Java桌面应用程序,我想使用log4j。在我的主要方法中,如果有这个:
PropertyConfigurator.configure("log4j.properties");
当我打开Jar时,log4j.properties文件位于同一目录中。
然而我收到了这个错误:
log4j:错误无法读取 配置文件[log4j.properties]。 java.io.FileNotFoundException: log4j.properties(系统不能 找到指定的文件)
我做错了什么?
答案 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内部日志记录。