Gdzie należy umieścić plik log4j.properties?

137

Napisałem projekt usługi sieciowej przy użyciu netbeans 6.7.1 z Glassfish v2.1, umieściłem log4j.properties w katalogu głównym projektu i użyłem:

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

w programie Constructor:

PropertyConfigurator.configure("log4j.properties");

aw funkcjach:

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

ale jest to informacja o błędzie (właściwie próbowałem umieścić to prawie w każdym katalogu, jaki mogłem sobie uświadomić):

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.

przykładowy projekt można pobrać z http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8

mononukleoza
źródło
2
Do czego służy PropertyConfigurator.configure („log4j.properties”); linia ? Nigdy tego nie używam. Twój plik log4j.xml musi znajdować się „gdzieś” w ścieżce klas.
Antoine Claval
1
Zajrzyj na stackoverflow.com/questions/1140358/…, aby dowiedzieć się, w jaki sposób jest rejestrowana sama konfiguracja log4j. Myślę, że to powinno ci bardzo pomóc, ponieważ niektóre kontenery mają własną konfigurację log4j.
dz.
@AntoineClaval Usunąłem tę przeklętą linię i zadziałało jak urok. Człowieku, co za jazda ..
Siddharth

Odpowiedzi:

115

Wiem, że jest trochę za późno, aby odpowiedzieć na to pytanie, a może już znalazłeś rozwiązanie, ale publikuję rozwiązanie, które znalazłem (po tym, jak dużo googlowałem), więc może trochę pomóc:

  1. Umieść log4j.properties w WEB-INF \ classes projektu, jak wspomniano wcześniej w tym wątku.
  2. Umieść plik log4j-xx.jar w katalogu WEB-INF \ lib
  3. Sprawdź, czy log4j został załadowany: dodaj -Dlog4j.debug@ koniec opcji java tomcat

Mam nadzieję, że to pomoże.

rgds

tęsknić
źródło
Użyj polecenia „run”, aby uzyskać Tomcat na pierwszym planie; możesz przekazać opcje java za pomocą wiersza poleceń. Ponadto opcja -x do bash jest przydatna, aby zobaczyć, co dokładnie dzieje się z twoimi opcjami: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
51

Jak już wspomniano, log4j.properties powinien znajdować się w katalogu zawartym w ścieżce klas, chcę dodać, że w zmienionym projekcie dobrym miejscem może być src/main/resources/log4j.properties

stivlo
źródło
26

Musisz umieścić go w katalogu głównym, który odpowiada twojemu kontekstowi wykonania.

Przykład:

    MyProject
       src
           MyClass.java
           log4j.properties

Jeśli zaczynasz wykonywanie z innego projektu, musisz mieć ten plik w projekcie używanym do rozpoczęcia wykonywania. Na przykład, jeśli inny projekt zawiera testy JUnit, musi mieć również swój plik log4j.properties.


Sugeruję użycie log4j.xml zamiast log4j.properties. Masz więcej opcji, uzyskaj pomoc ze swojego IDE i tak dalej ...

KLE
źródło
na przykład prawie umieściłem go w każdym katalogu. ale nie jest to pomocne przy wdrażaniu projektu Glassfish, ponieważ GF nie kopiuje właściwości do właściwego katalogu. Wygląda na to, że GF to traci.
mono
w rzeczywistości myślę, że problem polega na automatycznym rozmieszczaniu netbeanów. Próbuję wdrożyć przez plik wojenny w konsoli administratora, jest ok. Nie wiem, czy miałem rację. Jeśli miałem rację, dlaczego netbeans nie wdrażają tych plików podczas automatycznego wdrażania projektu.
mono
zadziałało ! ale czy to nie jest nieeleganckie… wydaje się, że lepiej umieścić go w folderze typu „zasób”.
Adams.H
26

Możesz określić lokalizację pliku konfiguracyjnego za pomocą argumentu VM -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"

Makatun
źródło
czy to file: / lub file: /// czy po prostu / path / to / file w systemie unix?
morfeusz
W przypadku systemu Windows to tylko plik: /, zgaduję, że unix jest taki sam
Amalgovinus
Jest to jedyna odpowiedź, która bierze pod uwagę wiele środowisk, które mają różne poziomy logowania.
Matt,
W systemie macOS w jvm.options serwera Liberty Server nie używaj cudzysłowów i używaj file: ///
wnm3
1
Tylko aktualizacja, która może pomóc zaoszczędzić trochę frustracji: jeśli używasz log4j2, nazwa argumentu została zmieniona nalog4j.configurationFile
dan.m to user2321368
17

W przypadku projektu opartego na Maven przechowuj swój log4j.properties w src / main / resources. Nic więcej do zrobienia!

Byorn
źródło
To wszystko i to samo dotyczy innych plików właściwości, takich jak XMLConfiguration w projektach Maven. Dzięki!
Ramon,
13

Jeśli umieścisz log4j.properties w src, nie musisz używać instrukcji -

PropertyConfigurator.configure("log4j.properties");

Zostanie pobrany automatycznie, ponieważ plik właściwości znajduje się w ścieżce klas.

Ani
źródło
10

Próbować:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
Jhon M
źródło
9

Plik powinien znajdować się w katalogu WEB-INF / classes. Ta struktura katalogów powinna być umieszczona w pliku war.

Martin OConnor
źródło
Teoretycznie jest to odpowiedź, ale problem polega na tym, że log4j.properties jest tracony, gdy glassfish wdraża plik wojenny.
mono
3
Powinien być w WEB-INF / classes i spakowany w pliku wojennym
Martin OConnor
@mono - przynajmniej w archiwum do pobrania NIE ma log4j.properties w web / WEB-INF / classes. Martin ma rację, tak powinno być.
fvu
Sztuczka polega na tym, że umieszczasz go w swoim folderze src (głównym folderze źródłowym), w trakcie budowania kodu plik jest automatycznie przenoszony do folderu klas ...
Mostafa Zeinali
7

Moje IDE to NetBeans. Umieściłem plik log4j.property, jak pokazano na zdjęciach

Korzeń

folder główny projektu

Sieć

folder sieciowy

WEB-INF

Folder WEB-INF

Aby użyć tego pliku właściwości, należy napisać następujący kod:

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");
    }
}

Możesz zdefiniować statyczny kontekst ServletContext z innego pliku JSP. Przykład:

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

Teraz możesz używać pliku log4j.property w swoich projektach.

Ali Mamedov
źródło
5

Kilka technicznie poprawnych, konkretnych odpowiedzi już udzielonych, ale generalnie może to być w dowolnym miejscu na ścieżce klas środowiska wykonawczego, tj. Wszędzie tam, gdzie JVM szuka klas.

Może to być katalog / src w Eclipse lub katalog WEB-INF / classes we wdrożonej aplikacji, ale najlepiej jest zdawać sobie sprawę z koncepcji ścieżki klas i dlaczego plik jest w niej umieszczony, nie traktuj tylko WEB-INF / klasy jako katalog „magiczny”.

Brian
źródło
5

Spędziłem dużo czasu, aby dowiedzieć się, dlaczego plik log4j.properties nie jest widoczny.
Potem zauważyłem, że był widoczny dla projektu tylko wtedy, gdy znajdował się zarówno w folderze MyProject / target / classes /, jak i MyProject / src / main / resources .
Mam nadzieję, że komuś się przyda.
PS: Projekt był oparty na maven.

RedCH
źródło
3

Zauważyłem, że Glassfish domyślnie patrzy na [Lokalizacja instalacji Glassfish] \ glassfish \ domains [twoja domena] \ jako domyślny katalog roboczy ... możesz upuścić plik log4j.properties w tej lokalizacji i zainicjować go w swoim kodzie za pomocą PropertyConfigurator jak już wspomniano...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");
Durandal00
źródło
1

Nie wiem, czy to poprawny sposób, ale rozwiązało mój problem. umieść plik log4j.properties w „folderze projektu” / config i użyj PropertyConfigurator.configure („config // log4j.properties”);

będzie działać z IDE, ale nie po samodzielnym uruchomieniu pliku jar. po samodzielnym uruchomieniu pliku jar po prostu skopiuj plik log4j.properties do folderu, w którym znajduje się plik jar. gdy plik jar i plik właściwości w tym samym katalogu działają dobrze.

sampathpremarathna
źródło
1

Umieść log4j.properties w ścieżce klas. Oto 2 przypadki, które pomogą Ci zidentyfikować właściwą lokalizację: 1. W przypadku aplikacji internetowej ścieżka klas to / WEB-INF / classes.

\WEB-INF      
    classes\
        log4j.properties
  1. Aby przetestować z głównego / jednostkowego testu, ścieżka klasy jest katalogiem źródłowym

    \Project\
       src\
          log4j.properties
    
Sharif
źródło
1

Można to zrobić na wiele sposobów:

Way1: Jeśli próbujesz w projekcie maven bez użycia PropertyConfigurator

Po pierwsze: sprawdź katalog zasobów w 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.

podąża za zrzutem ekranu:

! [tutaj wprowadź opis obrazu

Way2: Jeśli próbujesz z plikiem Properties dla projektu java / maven, użyj PropertyConfigurator

Umieść plik właściwości w dowolnym miejscu w projekcie i podaj poprawną ścieżkę. powiedz: src / javaLog4jProperties / log4j.properties

statyczny{

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

}

wprowadź opis obrazu tutaj

Way3: Jeśli próbujesz z XML w projekcie java / maven użyj DOMConfigurator

Umieść plik właściwości w dowolnym miejscu w projekcie i podaj poprawną ścieżkę. powiedz: src / javaLog4jProperties / log4j.xml

statyczny{

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

}

wprowadź opis obrazu tutaj

Shivendra Pandey
źródło
1

Twoja standardowa konfiguracja projektu będzie miała strukturę projektu podobną do:

src/main/java
src/main/resources

Umieszczasz log4j.properties w folderze zasobów, możesz utworzyć folder zasobów, jeśli taki nie istnieje

Robert Squire
źródło
0

Nie musisz określać PropertyConfigurator.configure("log4j.properties"); w swojej klasie Log4J, jeśli już zdefiniowałeś log4j.properties w strukturze projektu.

W przypadku Web Dynamic Project: -

Musisz zapisać swoje log4j.properties w WebContent -> WEB-INF -> log4j.properties

Mam nadzieję, że to może ci pomóc.

Manish Patel
źródło