Log4j 2 meldet sich nicht ab %% throwable
Ich möchte den Stack-Trace drucken, wenn Fehler mit diesem grundlegenden Log4j log4j2.xml protokolliert werden:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="throwable: %throwable"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Das ist alles, was ich in meinen Abhängigkeiten habe:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
</dependency>
</dependencies>
Wenn ich dies ausführe (asdf existiert nicht):
public class Main {
public static void main(String[] args) {
Logger logger = LogManager.getLogger();
try {
new FileInputStream("asdf");
} catch(Exception e) {
logger.error(e);
}
}
}
meine Ausgabe ist
throwable:
und ich möchte so etwas:
throwable: java.io.FileNotFoundException: asdf (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at Main.main(Main.java:10)
Dokumentation von PatternLayout unter: https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout Standard (% throwable) sollte den gesamten Stack-Trace protokollieren
Jede Hilfe wäre toll!
Bearbeiten: Ich benutze Java 8
Antworten
Sie verwenden Logger.error(Object). Alle Protokollierungsmethoden mit einem einzelnen Objektparameter protokollieren nur den toString()Wert dieses Objekts, auch wenn es sich um ein Throwable handelt. In Ihrem Fall enthält das Appender-Muster nicht %m/ %msg/, %messagesodass in der Konsolenausgabe nur "throwable:" angezeigt wird.
Wenn wir die Nachricht zum Muster hinzufügen, lautet die Ausgabe:
throwable: java.io.FileNotFoundException: asdf (The system cannot find the file specified)
Dies ist eine ziemlich häufige Gefahr bei der Verwendung von Log4j2, und leider scheint sich dies in Zukunft nicht zu ändern .
Um die Ausnahme und ihre Stapelverfolgung ordnungsgemäß zu protokollieren, können Sie entweder eine der Protokollierungsmethoden mit separaten ThrowableParametern verwenden, z. B. Logger.error(String, Throwable)oder Sie können verwenden Logger.catching(Level, Throwable). Die Protokollierungsmethoden mit Nachrichtenparameter sollten jedoch bevorzugt werden, da Sie damit den Kontext beschreiben können. Andernfalls fällt es Ihnen möglicherweise schwer, herauszufinden, wo die Protokollnachricht tatsächlich erstellt wurde.