Как настроить log4j с файлом свойств
Как мне получить log4j, чтобы подобрать файл свойств.
Я пишу настольное приложение Java, которое я хочу использовать log4j. В моем основном методе, если есть это:
PropertyConfigurator.configure("log4j.properties");
Файл log4j.properties находится в том же каталоге, когда я открываю Jar.
Все же я получаю эту ошибку:
log4j: ОШИБКА Не удалось прочитать файл конфигурации [log4j.properties]. java.io.FileNotFoundException: log4j.properties (система не может найти указанный файл)
Что я делаю неправильно?
10 ответов
Я считаю, что метод 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.
Когда вы используете 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
Просто установите -Dlog4j.configuration=file:log4j.properties у меня работает.
Затем log4j ищет файл log4j.properties в текущем рабочем каталоге приложения.
Помните, что log4j.configuration - это спецификация URL, поэтому добавьте "file:" перед вашим именем файла log4j.properties, если вы хотите сослаться на обычный файл в файловой системе, то есть на файл, который не находится в пути к классам!
Изначально я указал -Dlog4j.configuration=log4j.properties. Однако это работает, только если log4j.properties находится в пути к классам. Когда я скопировал log4j.properties в main / resources в моем проекте и перестроил его так, чтобы он был скопирован в целевой каталог (проект maven), это тоже сработало (или вы могли упаковать ваши log4j.properties в jar-файлы вашего проекта, но это не позволить пользователю редактировать конфигурацию регистратора!).
Это редактирование ответа от @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.
У меня есть этот код в моем приложении сегодня
File log4jfile = new File("./conf/log4j.properties");
PropertyConfigurator.configure(log4jfile.getAbsolutePath());
Относительный путь находится в рабочем каталоге JVM (где запускается JVM).
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
Так как аргументы 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();
}
Если ваше местоположение log4j.properties похоже на path/to/configfiles/log4j.properties . Затем просто используйте,
PropertyConfigurator.configure("path/to/configfiles/log4j.properties");
Кроме того, если путь src/main/resources/log4j.properties , то даже этот код не требуется, так как это расположение по умолчанию.
Я считаю, что каталог log4j.properties должен находиться в пути к классам Java. В вашем случае добавление CWD в classpath должно работать.
Вы можете включить внутреннее ведение журнала log4j, определив переменнуюlog4j.debug.