Log4j2-Konfiguration - Keine log4j2-Konfigurationsdatei gefunden

91

In letzter Zeit habe ich beschlossen, den Umgang mit dem log4j2-Logger zu lernen. Ich habe die erforderlichen JAR-Dateien heruntergeladen, eine Bibliothek und eine XML-Konfigurationsdatei erstellt und versucht, sie zu verwenden. Leider bekomme ich diese Aussage in der Konsole (Eclipse):

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

Dies ist mein Testklassencode:

package log4j.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

Und meine XML-Konfigurationsdatei:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Ich habe es auch mit XML ohne <Logger>Tags und Paketspezifikation und in verschiedenen Ordnern / Paketverzeichnissen versucht , aber es hat nicht geholfen. Jetzt log4j2.xmlbefindet sich meine Datei direkt im Projektordner in Eclipse.

Qbisiek
quelle
2
Der Doc sagt, es muss nur auf dem Klassenpfad sein. Ist es?
Fildor
Ja, ich habe es verpasst. Entschuldigung für die dumme Frage und danke :)
Qbisiek

Antworten:

139

Ist dies ein einfaches Eclipse-Java-Projekt ohne Maven usw.? In diesem Fall müssen Sie die log4j2.xmlDatei im srcOrdner ablegen, um sie im Klassenpfad finden zu können. Wenn Sie Maven verwenden, legen Sie es unter src/main/resourcesodersrc/test/resources

Tomasz W.
quelle
4
Mein Held! Ich hatte die Konfigurationsdatei im Klassenpfad (glaube ich), aber sie befand sich nicht im Ordner src. Ich habe es dort eingezogen und es funktioniert jetzt!
Shadoninja
Wie wird mit einem Maven-Projekt konfiguriert? (wie der Maven-Weg, weil ich denke, wenn ich eine 'log4j2.xml' unter den Klassenpfad stelle, würde ich arbeiten), danke für die Tipps :)
Enrique San Martín
log4j2.xml befindet sich in meinem src (JavaFX-Projekt ohne Maven), wird aber nicht gefunden. Ist das soooo kompliziert?!?! :(
Ewoks
2
Für sbtdas log4j2.xmlgeht src/main/resourcesauch rein.
Akavall
Ich kann diese Datei nicht finden log4j2.xml
Karthiga
32

Sie müssen eine der folgenden Lösungen auswählen:

  1. Legen Sie die Datei log4j2.xml im Ressourcenverzeichnis Ihres Projekts ab, damit log4j Dateien unter dem Klassenpfad findet.
  2. Verwenden Sie die Systemeigenschaft -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml
Abdulghaffar Al-Labadi
quelle
1
-Dlog4j.configurationFileist das, was ich brauchte, da das Projekt, an dem ich arbeite, nicht auf Maven basiert. Genial
Kimchi Man
15

Befolgte die Dokumentationen - Apache Log4j2 Configuratoin und Apache Log4j2 Maven bei der Konfiguration von log4j2 mit yaml. Gemäß der Dokumentation sind die folgenden Maven-Abhängigkeiten erforderlich:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

und

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

Nur diese hinzuzufügen, hat die Konfiguration nicht ausgewählt und immer einen Fehler ausgegeben. Das Debuggen der Konfiguration durch Hinzufügen -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEhalf beim Anzeigen der Protokolle. Später musste die Quelle mit Maven heruntergeladen werden und das Debuggen half beim Verständnis der abhängigen Klassen von log4j2. Sie sind aufgeführt in org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

Das Hinzufügen der Abhängigkeitszuordnung für jackson-dataformat-yamlhat nicht die ersten beiden Klassen. jackson-databindFügen Sie daher die Abhängigkeit hinzu, damit die Yaml-Konfiguration funktioniert:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

Sie können die Version hinzufügen, indem Sie auf den Test DependenciesAbschnitt des log4j-apiVersionselements aus dem MVN-Repository verweisen . Beispiel für die Version 2.8.1 von log4j-api, verweisen Sie auf diesen Link und suchen Sie die jackson-databindVersion.

Darüber hinaus können Sie mit dem folgenden Java-Code überprüfen, ob die Klassen im Klassenpfad verfügbar sind:

System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }
James Jithin
quelle
3

Eclipse sieht keine Datei, bis Sie eine Aktualisierung der IDE erzwingen. Es ist eine Funktion! Sie können die Datei also im gesamten Projekt ablegen, und Eclipse ignoriert sie vollständig und wirft diese Fehler aus. Klicken Sie in der Eclipse-Projektansicht auf Aktualisieren, und dann funktioniert es.

Mike Ashby
quelle
3

Zusätzlich zu dem, was Tomasz W geschrieben hat, können Sie beim Starten Ihrer Anwendung folgende Einstellungen verwenden:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

um die meisten Konfigurationsprobleme zu bekommen.

Weitere Informationen finden Sie unter Log4j2-FAQ: Wie debugge ich meine Konfiguration?

Seweryn Habdank-Wojewódzki
quelle
0

In meinem Fall musste ich es in den bin-Ordner meines Projekts legen, auch wenn mein Klassenpfad auf den src-Ordner gesetzt ist. Ich habe keine Ahnung warum, aber es ist einen Versuch wert.

Florian
quelle
Dies deutet darauf hin, dass das Projekt nicht erkennt, dass der Ordner mit Ihrer Konfiguration ein Ressourcenordner ist, sodass die Datei im Rahmen des Builds nicht automatisch kopiert wird. Ich würde vorschlagen, dies weiter zu untersuchen, da Sie schließlich eine Änderung an der Quelle vornehmen werden, die nicht in den Ordner bin kopiert wird, und sich am Ende lange fragen müssen, warum Ihre Änderung nicht funktioniert hat.
Sarah Phillips