Подтвердить что ты не робот

Как настроить log4j с файлом свойств

Как получить log4j для получения файла свойств.

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

   PropertyConfigurator.configure("log4j.properties");

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

Но я получаю эту ошибку:

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

Что я делаю неправильно?

4b9b3361

Ответ 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();
    }