Wo soll ich die Datei log4j.properties ablegen?

135

Ich habe ein Webdienstprojekt mit netbeans 6.7.1 mit glassfish v2.1 geschrieben, log4j.properties in das Stammverzeichnis des Projekts gestellt und Folgendes verwendet:

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

im Konstruktor:

PropertyConfigurator.configure("log4j.properties");

und in Funktionen:

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

aber es ist eine Fehlerinformation (eigentlich habe ich versucht, fast jedes Verzeichnis zu schreiben, das ich realisieren konnte):

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.

Das Beispielprojekt kann von http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8 abgerufen werden

Mono
quelle
2
Was ist der Zweck der PropertyConfigurator.configure ("log4j.properties"); Linie ? Ich benutze diesen nie. Ihre log4j.xml-Datei darf sich nur "irgendwo" in Ihrem Klassenpfad befinden.
Antoine Claval
1
Unter stackoverflow.com/questions/1140358/… finden Sie Informationen dazu, wie die log4j-Konfiguration selbst protokolliert wird. Ich denke, das sollte Ihnen sehr helfen, da einige Container ihre eigene log4j-Konfiguration haben.
dz.
@AntoineClaval Ich habe diese verfluchte Linie entfernt und es hat wie ein Zauber funktioniert. Mann, was für eine Fahrt ..
Siddharth

Antworten:

113

Ich weiß, dass es etwas spät ist, diese Frage zu beantworten, und vielleicht haben Sie die Lösung bereits gefunden, aber ich poste die Lösung, die ich gefunden habe (nachdem ich viel gegoogelt habe), sodass es ein wenig helfen kann:

  1. Fügen Sie log4j.properties unter WEB-INF \ -Klassen des Projekts ein, wie zuvor in diesem Thread erwähnt.
  2. Fügen Sie log4j-xx.jar unter WEB-INF \ lib ein
  3. Testen Sie, ob log4j geladen wurde: Fügen Sie -Dlog4j.debug@ das Ende Ihrer Java-Optionen von Tomcat hinzu

Hoffe das wird helfen.

rgds

Fräulein
quelle
Verwenden Sie den Befehl 'run', um Tomcat in den Vordergrund zu stellen. Sie können Java-Optionen über die Befehlszeile übergeben. Die Option -x zum Bash ist auch nützlich, um zu sehen, was genau mit Ihren Optionen passiert: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
50

Wie bereits erwähnt, sollte sich log4j.properties in einem Verzeichnis befinden, das im Klassenpfad enthalten ist. Ich möchte hinzufügen, dass in einem mavenisierten Projekt ein guter Ort sein kann src/main/resources/log4j.properties

stivlo
quelle
26

Sie können den Speicherort der Konfigurationsdatei mit dem VM-Argument -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties" angeben.

Makatun
quelle
Ist es Datei: / oder Datei: /// oder nur / Pfad / zu / Datei auf einem Unix-System?
Morpheus
Für Windows ist es nur Datei: /, ich
vermute,
Dies ist imo die einzige Antwort, die mehrere Umgebungen mit unterschiedlichen Protokollstufen berücksichtigt.
Matt
Unter macOS verwenden die jvm.options von Liberty Server keine Anführungszeichen und verwenden die Datei: ///
wnm3
Nur ein Update, das helfen könnte, einige Frustrationen zu vermeiden: Wenn Sie log4j2 verwenden, wurde der Name des Arguments inlog4j.configurationFile
dan.m
25

Sie müssen es in das Stammverzeichnis legen, das Ihrem Ausführungskontext entspricht.

Beispiel:

    MyProject
       src
           MyClass.java
           log4j.properties

Wenn Sie mit der Ausführung von einem anderen Projekt aus beginnen, muss diese Datei in dem Projekt enthalten sein, das zum Starten der Ausführung verwendet wird. Wenn ein anderes Projekt beispielsweise einige JUnit-Tests enthält, muss auch die Datei log4j.properties vorhanden sein.


Ich schlage vor, log4j.xml anstelle der log4j.properties zu verwenden. Sie haben mehr Optionen, erhalten Unterstützung von Ihrer IDE und so weiter ...

KLE
quelle
Zum Beispiel habe ich es fast in jedes Verzeichnis gestellt. Es ist jedoch nicht hilfreich, Glassfish ein Projekt bereitzustellen, da GF die Eigenschaften nicht in das richtige Verzeichnis kopiert. Es scheint, dass GF es verliert.
Mono
Ich denke, das Problem liegt in der automatischen Bereitstellung von Netbeans. Ich versuche, durch Kriegsdatei in der Administratorkonsole bereitzustellen, es ist in Ordnung. Ich weiß nicht, ob ich recht hatte. Wenn ich recht hatte, warum stellen NetBeans diese Dateien nicht bereit, wenn das Projekt automatisch bereitgestellt wird?
Mono
es funktionierte ! aber ist es nicht unelegant ... es ist besser in einem "Ressourcen" -Ordner abgelegt.
Adams.H
17

Behalten Sie für ein Maven-basiertes Projekt Ihre log4j.properties in src / main / resources. Nichts weiter zu tun!

Byorn
quelle
Das war's auch für andere Eigenschaftendateien wie XMLConfiguration in Maven Projects. Vielen Dank!
Ramon
13

Wenn Sie log4j.properties in src einfügen, müssen Sie die Anweisung nicht verwenden -

PropertyConfigurator.configure("log4j.properties");

Es wird automatisch übernommen, da sich die Eigenschaftendatei im Klassenpfad befindet.

Ani
quelle
10

Versuchen:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
Jhon M.
quelle
9

Die Datei sollte sich im Verzeichnis WEB-INF / classes befinden. Diese Verzeichnisstruktur sollte in die War-Datei gepackt werden.

Martin OConnor
quelle
Theoretisch ist es die Antwort, aber das Problem ist, dass log4j.properties verloren geht, wenn Glassfish eine Kriegsdatei bereitstellt.
Mono
3
Es sollte in WEB-INF / Klassen sein und in der Kriegsdatei verpackt sein
Martin OConnor
@mono - Zumindest im herunterladbaren Archiv gibt es KEINE log4j.properties in web / WEB-INF / classes. Martin hat recht, dort sollte es sein.
fvu
Der Trick ist, Sie legen es in Ihren src-Ordner (Ihren
Stammquellordner), während Sie
7

Meine IDE ist NetBeans. Ich habe die Datei log4j.property wie auf den Bildern gezeigt abgelegt

Wurzel

Stammordner des Projekts

Netz

Webordner

WEB-INF

WEB-INF-Ordner

Um diese Eigenschaftendatei zu verwenden, müssen Sie diesen Code schreiben:

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

Sie können den statischen ServletContext-Kontext aus einer anderen JSP-Datei definieren. Beispiel:

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

Jetzt können Sie die Datei log4j.property in Ihren Projekten verwenden.

Ali Mamedov
quelle
5

Einige technisch korrekte spezifische Antworten wurden bereits bereitgestellt, können sich jedoch im Allgemeinen an einer beliebigen Stelle im Laufzeitklassenpfad befinden, dh überall dort, wo Klassen von der JVM gesucht werden.

Dies kann das Verzeichnis / src in Eclipse oder das Verzeichnis WEB-INF / classes in Ihrer bereitgestellten App sein. Beachten Sie jedoch am besten das Klassenpfadkonzept und warum die Datei darin abgelegt ist. Behandeln Sie nicht nur WEB-INF / Klassen als "magisches" Verzeichnis.

Brian
quelle
5

Ich habe viel Zeit darauf verwendet, herauszufinden, warum die Datei log4j.properties nicht angezeigt wird.
Dann bemerkte ich, dass es für das Projekt nur sichtbar war, wenn es sich in den Ordnern MyProject / target / classes / und MyProject / src / main / resources befand .
Hoffe, es wird jemandem nützlich sein.
PS: Das Projekt basierte auf Maven.

RedCH
quelle
3

Ich habe festgestellt, dass Glassfish standardmäßig [Glassfish-Installationsort] \ glassfish \ Domains [Ihre Domain] \ als Standardarbeitsverzeichnis betrachtet. Sie können die Datei log4j.properties an diesem Speicherort ablegen und mit PropertyConfigurator in Ihrem Code initialisieren wie vorab erwähnt...

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

Ich weiß nicht, dass dies der richtige Weg ist. Aber es hat mein Problem gelöst. Legen Sie die Datei log4j.properties in "Projektordner" / config ab und verwenden Sie PropertyConfigurator.configure ("config // log4j.properties").

Es funktioniert mit IDE, aber nicht, wenn Sie die JAR-Datei selbst ausführen. Wenn Sie die JAR-Datei selbst ausführen, kopieren Sie einfach die Datei log4j.properties in den Ordner, in dem sich die JAR-Datei befindet. Wenn sich die JAR- und die Eigenschaftendatei in demselben Verzeichnis befinden, in dem sie ordnungsgemäß ausgeführt wird.

sampathpremarathna
quelle
1

Fügen Sie log4j.properties in den Klassenpfad ein. Hier sind die 2 Fälle, die Ihnen helfen, den richtigen Speicherort zu ermitteln: 1. Für Webanwendungen lautet der Klassenpfad / WEB-INF / classes.

\WEB-INF      
    classes\
        log4j.properties
  1. Zum Testen vom Haupt- / Komponententest ist der Klassenpfad das Quellverzeichnis

    \Project\
       src\
          log4j.properties
Sharif
quelle
1

Es gibt viele Möglichkeiten, dies zu tun:

Weg 1: Wenn Sie es in einem Maven-Projekt versuchen, ohne PropertyConfigurator zu verwenden

Erstens: Suchen Sie unter scr / main nach dem Ressourcenverzeichnis

  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.

folgt dem Screenshot:

! [Bildbeschreibung hier eingeben

Weg 2: Wenn Sie es mit der Eigenschaftendatei für ein Java / Maven-Projekt versuchen, verwenden Sie den PropertyConfigurator

Platzieren Sie die Eigenschaftendatei an einer beliebigen Stelle im Projekt und geben Sie den richtigen Pfad an. Sagen Sie: src / javaLog4jProperties / log4j.properties

statisch{

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

}}

Geben Sie hier die Bildbeschreibung ein

Weg 3: Wenn Sie es mit XML in einem Java / Maven-Projekt versuchen, verwenden Sie DOMConfigurator

Platzieren Sie die Eigenschaftendatei an einer beliebigen Stelle im Projekt und geben Sie den richtigen Pfad an. Sagen Sie: src / javaLog4jProperties / log4j.xml

statisch{

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

}}

Geben Sie hier die Bildbeschreibung ein

Shivendra Pandey
quelle
1

Ihr Standard-Projekt-Setup hat eine Projektstruktur wie:

src/main/java
src/main/resources

Sie platzieren log4j.properties im Ressourcenordner. Sie können den Ressourcenordner erstellen, falls keiner vorhanden ist

Robert Squire
quelle
0

Sie müssen PropertyConfigurator.configure("log4j.properties");in Ihrer Log4J-Klasse nicht angeben , ob Sie die log4j.properties bereits in Ihrer Projektstruktur definiert haben.

Im Fall von Web Dynamic Project: -

Sie müssen Ihre log4j.properties unter WebContent -> WEB-INF -> log4j.properties speichern

Ich hoffe das kann dir helfen.

Manish Patel
quelle