Де я повинен розмістити файл 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


Використовуйте команду "запустити", щоб вийти на перший план tomcat; Ви можете передавати параметри Java через командний рядок. Також опція -x bash корисна, щоб побачити, що саме відбувається з вашими параметрами: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM

50

Як уже зазначалося, log4j.properties має бути в каталозі, включеному в класний шлях, я хочу додати, що в mavenized проект хороше місце може бути src/main/resources/log4j.properties


26

Ви можете вказати розташування файлу конфігурації за допомогою аргументу VM -Dlog4j.configuration = "файл: / C: /workspace3/local/log4j.properties"


це файл: / або файл: /// або просто / шлях / до / файл у системі Unix?
морфей

Для Windows це просто файл: /, я думаю, unix те саме
Amalgovinus

Це єдиний відповідь, який враховує декілька середовищ, які мають різні рівні журналу.
Метт

На macOS у jvm.options Liberty Server не використовуються цитати та не використовується файл: ///
wnm3

Просто оновлення, яке може допомогти врятувати розчарування: якщо ви використовуєте log4j2, ім'я аргументу було змінено наlog4j.configurationFile
dan.m був user2321368

25

Ви повинні помістити його в кореневий каталог, що відповідає вашому контексту виконання.

Приклад:

    MyProject
       src
           MyClass.java
           log4j.properties

Якщо ви починаєте виконувати з іншого проекту, вам потрібно мати цей файл у проекті, який використовується для запуску виконання. Наприклад, якщо інший проект має деякі тести JUnit, він також повинен мати свій файл log4j.properties.


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


наприклад, я майже поклав її в кожен каталог. але це не корисно для проекту розгортання Glassfish, оскільки GF не копіює властивості у потрібний каталог. Здається, GF це втрачає.
моно

насправді, я думаю, проблема полягає в автоматичному розгортанні мереж. Я намагаюся розгорнути файли війни в консолі адміністратора, це нормально. Я не знаю, чи мав я рацію. Якщо я мав рацію, чому Netbeans не розгортає ці файли при автоматичному розгортанні проекту.
моно

це спрацювало ! але це неелегантно ... він вважає, що краще розмістити папку "ресурс".
Адамс.H

17

Для проекту на базі Maven зберігайте свої log4j.properties в src / main / ресурси. Більше нічого робити!


Це все, і це ж саме для інших файлів властивостей, таких як XMLConfiguration в Maven Projects. Дякую!
Рамон

13

Якщо ви помістите log4j.properties всередині src, вам не потрібно використовувати оператор -

PropertyConfigurator.configure("log4j.properties");

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


10

Спробуйте:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));

9

Файл повинен розташовуватися в каталозі WEB-INF / класів. Ця структура каталогів повинна бути упакована у файл війни.


теоретично це відповідь, але проблема полягає в тому, що log4j.properties розміщується, коли кегля розгортає військовий файл.
моно

3
Він повинен бути в WEB-INF / класах і упакований у військовий файл
Martin OConnor,

@mono - принаймні в архіві, що завантажується, немає веб-класів log4j.properties в веб / WEB-INF /. Мартін має рацію, саме там має бути.
fvu

Підступність полягає в тому, що ви поміщаєте його в папку src, (Ваша папка кореневого джерела), в процесі створення вашого коду файл автоматично передається в папку класів ...
Mostafa Zeinali

7

Мій IDE - NetBeans. Я ставлю файл log4j.property, як показано на малюнках

Корінь

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

Веб

веб-папка

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 dir в Eclipse або каталог WEB-INF / класів у вашому розгорнутому додатку, але найкраще бути в курсі концепції classpath і чому файл розміщений у ній, не просто звертайтесь до WEB-INF / класи як "магічний" каталог.


5

Я витратив чимало часу, щоб з'ясувати, чому файл log4j.properties не видно.
Тоді я помітив, що його видно для проекту лише тоді, коли він був у папках MyProject / target / класів / та MyProject / src / main / ресурси .
Сподіваюся, це комусь стане в нагоді.
PS: Проект був заснований на Maven.


3

Я виявив, що Glassfish за замовчуванням дивиться на [Glassfish location location] \ glassfish \ domeins [your domain] \ як робочу директорію за замовчуванням ... ви можете залишити файл log4j.properties у цьому місці та ініціалізувати його у своєму коді за допомогою PropertyConfigurator як згадувалося раніше ...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");

1

Я не знаю, що це правильний шлях. Але це вирішило мою проблему. помістіть файл log4j.properties у "папку проекту" / config та використовуйте PropertyConfigurator.configure ("config // log4j.properties");

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


1

Покладіть log4j.properties у classpath. Ось два випадки, які допоможуть вам визначити правильне розташування - 1. Для веб-додатків класним шляхом є / WEB-INF / класи.

\WEB-INF      
    classes\
        log4j.properties
  1. Щоб перевірити тест main / unit, classpath - це вихідний каталог

    \Project\
       src\
          log4j.properties

1

Є багато способів зробити це:

Шлях1: Якщо ви намагаєтеся зробити проект 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.

слід за скріншотом:

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

Шлях2: Якщо ви намагаєтеся створити файл властивостей для проекту java / maven, використовуйте PropertyConfigurator

Розмістіть файл властивостей у будь-якому місці проекту та вкажіть правильний шлях. скажіть: src / javaLog4jProperties / log4j.properties

статичний {

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

}

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

Шлях 3: Якщо ви намагаєтеся використовувати 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

Я сподіваюся, що це може вам допомогти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.