Как настроить log4j с файлом свойств - PullRequest
24 голосов
/ 18 февраля 2010

Как мне заставить log4j подобрать файл свойств.

Я пишу настольное приложение Java, которое я хочу использовать log4j. В моем основном методе, если есть это:

   PropertyConfigurator.configure("log4j.properties");

Файл log4j.properties находится в том же каталоге, когда я открываю Jar.

Все же я получаю эту ошибку:

log4j: ОШИБКА не удалось прочитать файл конфигурации [log4j.properties]. java.io.FileNotFoundException: log4j.properties (система не может найти указанный файл)

Что я делаю не так?

Ответы [ 8 ]

47 голосов
/ 18 февраля 2010

Я полагаю, что метод 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.

13 голосов
/ 10 февраля 2011

Когда вы используете 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
7 голосов
/ 11 апреля 2016

просто установите -Dlog4j.configuration = file: log4j.properties у меня работает.

log4j затем ищет файл log4j.properties в текущем рабочем каталоге приложения.

Помните, что log4j.configuration - это URL спецификацию, поэтому добавьте «file:» перед вашим именем файла log4j.properties, если вы хотите сослаться на обычный файл в файловой системе, то есть файл, не находящийся в пути к классам!= log4j.properties.Однако это работает, только если log4j.properties находится в пути к классам.Когда я скопировал файл log4j.properties в main / resources в моем проекте и перестроил его так, чтобы он был скопирован в целевой каталог (проект maven), это тоже сработало (или вы могли упаковать ваши log4j.properties в файлы проекта jar, но это неразрешить пользователю редактировать конфигурацию регистратора!).

4 голосов
/ 21 октября 2013

Это редактирование ответа от @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.

2 голосов
/ 10 февраля 2011

У меня есть этот код в моем приложении сегодня

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

Относительный путь от рабочего каталога JVM (где запускается JVM).

0 голосов
/ 08 августа 2013

Поскольку аргументы 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();
    }
0 голосов
/ 10 февраля 2011

Я считаю, что каталог log4j.properties должен находиться в пути к классам Java. В вашем случае добавление CWD в classpath должно работать.

0 голосов
/ 18 февраля 2010

Вы можете включить внутреннее ведение журнала log4j, определив переменную ' log4j.debug '.

...