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)
。但是,应该首选带有消息参数的日志记录方法,因为它们允许您描述上下文。否则您可能很难找出日志消息的实际创建位置。
我想在使用这个基本的 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)
。但是,应该首选带有消息参数的日志记录方法,因为它们允许您描述上下文。否则您可能很难找出日志消息的实际创建位置。