Куда мне положить файл log4j.properties?

135

Я написал проект веб-службы с использованием netbeans 6.7.1 и glassfish v2.1, поместил log4j.properties в корневой каталог проекта и использовал:

static Logger logger = Logger.getLogger(MyClass.class);

в конструкторе:

PropertyConfigurator.configure("log4j.properties");

и по функциям:

logger.info("...");
logger.error("...");
// ...

но это информация об ошибке (на самом деле я пытался поместить ее почти в каждый каталог, который мог понять):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

пример проекта можно получить с http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8

мононуклеоз
источник
2
Какова цель PropertyConfigurator.configure ("log4j.properties"); линия ? Я никогда этим не пользуюсь. Ваш файл log4j.xml должен находиться только «где-то» в вашем пути к классам.
Антуан Клаваль,
1
Посмотрите на stackoverflow.com/questions/1140358/…, чтобы узнать, как регистрируется сама конфигурация log4j. Я думаю, это должно вам очень помочь, потому что у некоторых контейнеров есть собственная конфигурация log4j.
дз.
@AntoineClaval Я удалил эту проклятую строчку, и она сработала как шарм. Чувак, какая поездка ..
Сиддхартх

Ответы:

114

Я знаю, что немного поздно отвечать на этот вопрос, и, возможно, вы уже нашли решение, но я публикую решение, которое я нашел (после того, как много погуглил), поэтому это может немного помочь:

  1. Поместите log4j.properties в WEB-INF \ классы проекта, как упоминалось ранее в этом потоке.
  2. Поместите log4j-xx.jar в WEB-INF \ lib
  3. Проверьте, был ли загружен log4j: добавьте -Dlog4j.debug@ в конце ваших java-параметров tomcat

Надеюсь, это поможет.

Rgds

Мисс
источник
Используйте команду «run», чтобы получить tomcat на переднем плане; Вы можете передать параметры Java через командную строку. Кроме того, параметр -x для bash полезен, чтобы увидеть, что именно происходит с вашими параметрами: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
50

Как уже говорилось, log4j.properties должен находиться в каталоге, включенном в classpath, я хочу добавить, что в проекте mavenized хорошее место может быть src/main/resources/log4j.properties

stivlo
источник
26

Вы можете указать расположение файла конфигурации с помощью аргумента виртуальной машины -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"

Makatun
источник
это файл: / или файл: /// или просто / путь / к / файлу в системе unix?
morpheus
Для окон это просто файл: /, я предполагаю, что unix то же самое
Амальговинус
Это единственный ответ, который учитывает несколько сред с разными уровнями журналов.
Мэтт
В macOS в jvm.options Liberty Server не используйте кавычки и используйте file: ///
wnm3
Просто обновление, которое может помочь избежать разочарования: если вы используете log4j2, имя аргумента было изменено наlog4j.configurationFile
dan.m было user2321368
25

Вы должны поместить его в корневой каталог, который соответствует вашему контексту выполнения.

Пример:

    MyProject
       src
           MyClass.java
           log4j.properties

Если вы начинаете выполнение из другого проекта, вам необходимо, чтобы этот файл в проекте использовался для запуска выполнения. Например, если другой проект содержит несколько тестов JUnit, ему также необходим файл log4j.properties.


Я предлагаю использовать log4j.xml вместо log4j.properties. У вас есть больше возможностей, помощь от вашей IDE и так далее ...

KLE
источник
например, я поместил его почти в каждый каталог. но это бесполезно для проекта развертывания Glassfish, потому что GF не копирует свойства в правильный каталог. Кажется, GF действительно его теряет.
моно,
на самом деле, я думаю, что проблема в автоматическом развертывании netbeans. Я пытаюсь развернуть файл war в консоли администратора, все в порядке. Не знаю, был ли я прав. Если я был прав, почему netbeans не развертывают эти файлы при автоматическом развертывании проекта.
моно,
это сработало ! но разве это не изящно ... мне кажется, что лучше поместить его в папку типа "ресурс".
Adams.H 05
17

Для проекта на основе Maven сохраните свой log4j.properties в src / main / resources. Больше нечего делать!

Byorn
источник
Вот и все, и то же самое для других файлов свойств, таких как XMLConfiguration в Maven Projects. Спасибо!
Рамон
13

Если вы поместите log4j.properties внутри src, вам не нужно использовать оператор -

PropertyConfigurator.configure("log4j.properties");

Он будет взят автоматически, поскольку файл свойств находится в пути к классам.

Ани
источник
10

Пытаться:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
Джон М
источник
9

Файл должен находиться в каталоге WEB-INF / classes. Эта структура каталогов должна быть упакована в файл войны.

Мартин Оконнор
источник
теоретически это и есть ответ, но проблема в том, что log4j.properties теряется при развертывании файла war.
моно
3
Он должен быть в WEB-INF / classes и упакован в файл войны
Мартин Оконнор,
@mono - по крайней мере, в скачиваемом архиве НЕТ log4j.properties в web / WEB-INF / classes. Мартин прав, так и должно быть.
fvu 02
Хитрость в том, что вы помещаете его в свою папку src (вашу корневую исходную папку), в процессе
сборки
7

Моя IDE - это NetBeans. Я кладу файл log4j.property как показано на картинках

корень

корневая папка проекта

Web

веб-папка

WEB-INF

Папка WEB-INF

Чтобы использовать это свойство файла Вам необходимо написать следующий код:

package example;

import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Logger;
import javax.servlet.*;
public class test {

public static ServletContext context;
static Logger log = Logger.getLogger("example/test");

public test() {

        String homeDir = context.getRealPath("/");
        File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
        PropertyConfigurator.configure(propertiesFile.toString());
        log.info("This is a test");
    }
}

Вы можете определить статический контекст ServletContext из другого файла JSP. Пример:

test.context = getServletContext(); 
test sample = new test(); 

Теперь вы можете использовать файл log4j.property в своих проектах.

Али Мамедов
источник
5

Уже предоставлено несколько технически правильных конкретных ответов, но в целом он может быть в любом месте пути к классам во время выполнения, то есть везде, где классы ищет JVM.

Это может быть каталог / src в Eclipse или каталог WEB-INF / classes в развернутом приложении, но лучше знать о концепции пути к классам и о том, почему файл помещен в него, а не просто обрабатывать WEB-INF / классы как «волшебный» справочник.

Брайан
источник
5

Я потратил много времени, чтобы выяснить, почему файл log4j.properties не отображается .
Затем я заметил, что он был виден для проекта только тогда, когда он был в папках MyProject / target / classes / и MyProject / src / main / resources .
Надеюсь, это будет кому-нибудь полезно.
PS: Проект был основан на maven.

RedCH
источник
3

Я обнаружил, что Glassfish по умолчанию смотрит на [место установки Glassfish] \ glassfish \ domains [ваш домен] \ как рабочий каталог по умолчанию ... вы можете поместить файл log4j.properties в это место и инициализировать его в своем коде с помощью PropertyConfigurator как упоминалось ранее ...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");
Durandal00
источник
1

Я не знаю, что это правильный способ, но он решил мою проблему. поместите файл log4j.properties в «папку проекта» / config и используйте PropertyConfigurator.configure («config // log4j.properties»);

он будет работать с IDE, но не при самостоятельном запуске файла jar. когда вы запускаете файл jar самостоятельно, просто скопируйте файл log4j.properties в папку, в которой находится файл jar. когда файл jar и файл свойств в том же каталоге, он работает нормально.

sampathpremarathna
источник
1

Поместите log4j.properties в путь к классам. Вот 2 случая, которые помогут вам определить правильное местоположение: 1. Для веб-приложения classpath - это / WEB-INF / classes.

\WEB-INF      
    classes\
        log4j.properties
  1. Для тестирования из основного / модульного теста путь к классам - это исходный каталог

    \Project\
       src\
          log4j.properties
Шариф
источник
1

Есть много способов сделать это:

Way1: если вы пытаетесь использовать проект maven без использования PropertyConfigurator

Во-первых: проверьте каталог ресурсов в scr / main

  if available,
       then: create a .properties file and add all configuration details.
  else
       then: create a directory named resources and a file with .properties     
write your configuration code/details.

следует на скриншоте:

! [введите описание изображения здесь

Way2: Если вы пытаетесь использовать файл свойств для проекта java / maven, используйте PropertyConfigurator

Поместите файл свойств в любом месте проекта и укажите правильный путь. скажем: src / javaLog4jProperties / log4j.properties

статическая {

 PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");

}

введите описание изображения здесь

Way3: если вы пытаетесь использовать xml в проекте java / maven, используйте DOMConfigurator

Поместите файл свойств в любом месте проекта и укажите правильный путь. скажем: src / javaLog4jProperties / log4j.xml

статическая {

 DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");

}

введите описание изображения здесь

Шивендра Пандей
источник
1

Стандартная настройка вашего проекта будет иметь примерно такую ​​структуру:

src/main/java
src/main/resources

Вы помещаете log4j.properties в папку ресурсов, вы можете создать папку ресурсов, если она не существует

Роберт Сквайр
источник
0

На самом деле, я только что столкнулся с этой проблемой в стандартной структуре проекта Java следующим образом:

\myproject
    \src
    \libs
    \res\log4j.properties

В Eclipse мне нужно добавить папку res для создания пути, однако в Intellij мне нужно пометить папку res как resouces, как показывает связанный снимок экрана: щелкните правой кнопкой мыши папку res и отметьте как ресурсы .

Чудо Чан
источник
0

Вам не нужно указывать PropertyConfigurator.configure("log4j.properties");в своем классе Log4J, если вы уже определили log4j.properties в структуре своего проекта.

В случае веб-динамического проекта: -

Вам нужно сохранить свой log4j.properties в разделе WebContent -> WEB-INF -> log4j.properties.

Надеюсь, это поможет вам.

Маниш Патель
источник