Как настроить log4j с файлом свойств
Как получить log4j для получения файла свойств.
Я пишу приложение для рабочего стола Java, которое я хочу использовать log4j. В моем основном методе, если у вас есть это:
PropertyConfigurator.configure("log4j.properties");
Файл log4j.properties находится в том же каталоге, когда я открываю Jar.
Но я получаю эту ошибку:
log4j: ОШИБКА Не удалось прочитать файл конфигурации [log4j.properties]. java.io.FileNotFoundException: log4j.properties(система не может найдите указанный файл)
Что я делаю неправильно?
Ответы
Ответ 1
Я считаю, что метод configure ожидает абсолютный путь. Во всяком случае, вы также можете сначала загрузить объект Properties:
Properties props = new Properties();
props.load(new FileInputStream("log4j.properties"));
PropertyConfigurator.configure(props);
Если файл свойств находится в банке, вы можете сделать что-то вроде этого:
Properties props = new Properties();
props.load(getClass().getResourceAsStream("/log4j.properties"));
PropertyConfigurator.configure(props);
Вышеприведенное предполагает, что log4j.properties находится в корневой папке файла jar.
Ответ 2
При использовании PropertyConfigurator.configure(Строка 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
Ответ 3
просто установите -Dlog4j.configuration = файл: log4j.properties работал у меня.
log4j затем ищет файл log4j.properties в текущем рабочем каталоге приложения.
Помните, что log4j.configuration является спецификацией URL-адреса, поэтому перед файлом log4j.properties добавьте 'file:', если вы хотите ссылаться на обычный файл в файловой системе, то есть на файл, не относящийся к пути к классам!
Первоначально я указал -Dlog4j.configuration = log4j.properties. Однако это работает только в том случае, если log4j.properties находится в пути к классам. Когда я скопировал log4j.properties в main/resources в моем проекте и перестроил его, чтобы он был скопирован в целевой каталог (проект maven), это тоже сработало (или вы могли бы упаковать ваши лог4j.properties в своих банках проекта, но это не будет разрешить пользователю редактировать конфигурацию регистратора!).
Ответ 4
У меня есть этот код в моем приложении сегодня
File log4jfile = new File("./conf/log4j.properties");
PropertyConfigurator.configure(log4jfile.getAbsolutePath());
Относительный путь - из рабочего каталога JVM (где запускается JVM).
Ответ 5
Это редактирование ответа от @kgiannakakis:
Исходный код неверен, потому что он неправильно закрывает InputStream после вызова Properties.load(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);
Если файл свойств находится в банке, вы можете сделать что-то вроде этого:
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.
Ответ 6
Вы можете включить log4j для внутреннего ведения журнала, указав переменную log4j.debug.
Ответ 7
Я считаю, что каталог log4j.properties должен находиться в пути класса java. В вашем случае должно быть добавлено CWD к пути к классам.
Ответ 8
Так как аргументы 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();
}