In letzter Zeit habe ich beschlossen, den Log4j2-Logger zu benutzen. Ich habe die erforderlichen JAR-Dateien heruntergeladen, eine Bibliothek, 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 Paketspezifikationen und in verschiedenen Ordnern/Paketen versucht, aber es hat nicht geholfen. Jetzt befindet sich meine log4j2.xml
-Datei direkt im Projektordner von Eclipse.
Ist dies ein einfaches Eclipse-Java-Projekt ohne Maven usw.? In diesem Fall müssen Sie die Datei log4j2.xml
im Ordner src
ablegen, um sie im Klassenpfad zu finden. Wenn Sie maven verwenden, legen Sie sie unter src/main/resources
oder src/test/resources
Sie müssen eine der folgenden Lösungen auswählen:
Verfolgte die Dokumentationen - Apache Log4j2 Configuratoin und Apache Log4j2 Maven bei der Konfiguration von log4j2 mit yaml. In der Dokumentation sind folgende 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>
Durch das Hinzufügen dieser Elemente wurde die Konfiguration nicht ausgewählt und es wurde immer ein Fehler angezeigt. Die Art und Weise von debugging configuration durch Hinzufügen von -Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACE
half dabei, die Protokolle anzuzeigen. Später musste die Quelle mithilfe von Maven heruntergeladen werden, und das Debuggen half dabei, die abhängigen Klassen von log4j2 zu verstehen. Sie sind in org.Apache.logging.log4j.core.config.yaml.YamlConfigurationFactory
aufgelistet:
com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory
Beim Hinzufügen von Abhängigkeitszuordnung für jackson-dataformat-yaml
werden die ersten beiden Klassen nicht angezeigt. Fügen Sie daher die jackson-databind
-Abhängigkeit hinzu, damit die Konfiguration der yaml 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 Abschnitt Test Dependencies
von log4j-api
version in MVN Repository verweisen. Z.B. Für Version 2.8.1 von log4j-api beziehen Sie sich auf link und suchen Sie die jackson-databind
-Version.
Darüber hinaus können Sie den folgenden Java-Code verwenden, um zu ü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);
}
Eclipse sieht nie eine Datei, bis Sie eine Aktualisierung der IDE erzwingen. Es ist eine Funktion! So können Sie die Datei überall im Projekt ablegen und Eclipse ignoriert sie vollständig und wirft diese Fehler ab. Klicken Sie in der Eclipse-Projektansicht auf "Aktualisieren" und dann funktioniert es.
Zusätzlich zu dem, was Tomasz W geschrieben hat, können Sie beim Starten Ihrer Anwendung Einstellungen verwenden:
-Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACE
um die meisten Konfigurationsprobleme zu bekommen.
Weitere Informationen finden Sie in den Log4j2-FAQs: Wie debugge ich meine Konfiguration?
In meinem Fall musste ich es in den bin-Ordner meines Projekts stellen, auch wenn mein Klassenpfad auf den src-Ordner gesetzt ist. Ich habe keine Ahnung warum, aber es ist einen Versuch wert.