2010-02-18 2 views
21

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

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

PropertyConfigurator.configure("log4j.properties"); 

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

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

log4j:ERROR Could not read configuration file [log4j.properties]. java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)

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

+1

Файл log4j.properties должен находиться в корневой папке вашего основного приложения (с тех пор, как вы пишете настольное приложение). –

ответ

43

Я считаю, что метод configure ожидает абсолютный путь. Во всяком случае, вы можете также попытаться загрузить объект а свойства первого:

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.

+0

Абсолютный путь в банке или файловой системе? – Dan

+0

Абсолютный путь в файловой системе. Используйте getResource, если файл находится в банке. – kgiannakakis

+0

У вас есть пример того, как это сделать? – Dan

-1

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

+1

Не отвечает на исходный вопрос. – Achow

+0

@anirbanchowdhury Нет, но это ценная альтернатива, которая должна быть задокументирована. Но продолжайте тратить свою репутацию на понижение ... у вас есть только пара сотен миллионов! – Jeach

+0

Это не личное, но я полностью понимаю, почему люди не комментируют после понижения. :) – Achow

1

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

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

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

12

При использовании 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 
0

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

0

Поскольку 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(); 
    } 
3

Это изменение ответа от @kgiannakakis: Исходный код неверен, потому что он неправильно закрывает InputStream после вызова Properties.load(InputStream). Из Javadocs: The specified stream remains open after this method returns.

================================

Я считаю, что настроить метод ожидает абсолютный путь. Во всяком случае, вы можете также попытаться загрузить объект а свойства первого:

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.

5

только что установленный -Dlog4j.configuration = файл: log4j.properties работал для меня.

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

Помните, что log4j.configuration является URL спецификации, поэтому добавьте «файл:» в передней части log4j.properties файла, если вы хотите сослаться на обычный файл в файловой системе, то есть файл не на пути к классам !

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