Log4j 2 ne se déconnecte pas% throwable

Sep 04 2020

Je veux imprimer la trace de la pile lors de la journalisation des erreurs à l'aide de ce Log4j log4j2.xml de base:

<?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>

C'est tout ce que j'ai dans mes dépendances:

    <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>

Quand je lance ceci (asdf n'existe pas):

public class Main {
    public static void main(String[] args) {
        Logger logger = LogManager.getLogger();
        try {
            new FileInputStream("asdf");
        } catch(Exception e) {
            logger.error(e);
        }
    }
}

ma sortie est

throwable: 

et je veux quelque chose comme ça:

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)

documentation de PatternLayout à: https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout default (% throwable) doit consigner la trace de la pile entière

Toute aide est la bienvenue!

Edit: j'utilise Java 8

Réponses

1 Marcono1234 Sep 04 2020 at 03:35

Vous utilisez Logger.error(Object). Toutes les méthodes de journalisation avec un seul paramètre d'objet enregistrent uniquement la toString()valeur de cet objet, même s'il s'agit d'un objet Throwable. Dans votre cas, le modèle d'ajout ne contient pas %m/ %msg/ %messagedonc vous ne voyez que "throwable:" dans la sortie de la console.
Si nous ajoutons le message au modèle, la sortie est:

throwable: java.io.FileNotFoundException: asdf (The system cannot find the file specified) 

C'est un piège assez courant lors de l'utilisation de Log4j2 et, malheureusement, il semble que cela ne changera pas à l'avenir .

Pour enregistrer correctement l'exception et sa trace de pile, vous pouvez soit utiliser l'une des méthodes de journalisation avec un Throwableparamètre distinct , par exemple Logger.error(String, Throwable), soit utiliser Logger.catching(Level, Throwable). Cependant, les méthodes de journalisation avec paramètre de message doivent être préférées car elles vous permettent de décrire le contexte. Sinon, vous pourriez avoir du mal à trouver où le message de journal a été réellement créé.