Log4j 2 未注销 %throwable

Log4j 2 not logging out %throwable

我想在使用这个基本的 Log4j 记录错误时打印堆栈跟踪 log4j2.xml:

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

这是我所有的依赖项:

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

当我运行这个(asdf不存在)时:

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

我的输出是

throwable: 

我想要这样的东西:

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)

来自 PatternLayout 的文档位于:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout 默认(%throwable)应该记录整个堆栈跟踪

任何帮助都会很棒!

编辑:我正在使用 Java 8

您正在使用 Logger.error(Object)。所有具有单个对象参数的日志记录方法仅记录该对象的 toString() 值,即使它是一个 Throwable。在您的情况下,appender 模式不包含 %m/%msg/%message 因此您只能在控制台输出中看到“throwable:”。
如果我们将消息添加到模式中,输出为:

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

这是使用 Log4j2 时非常常见的陷阱,遗憾的是它出现了这个 won't change in the future

要正确记录异常及其堆栈跟踪,您可以使用一种带有单独 Throwable 参数的记录方法,例如Logger.error(String, Throwable),也可以使用Logger.catching(Level, Throwable)。但是,应该首选带有消息参数的日志记录方法,因为它们允许您描述上下文。否则您可能很难找出日志消息的实际创建位置。