Как настроить 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.

Другие вопросы по тегам