Syn*_*r0r 147 java logging log4j stack-trace
假如您执行e.printStackTrace(),则会捕获异常并在标准输出(例如,控制台)上获取以下内容:
java.io.FileNotFoundException: so.txt
at java.io.FileInputStream.<init>(FileInputStream.java)
at ExTest.readMyFile(ExTest.java:19)
at ExTest.main(ExTest.java:7)
Run Code Online (Sandbox Code Playgroud)
现在我想把它发送到一个记录器,比如log4j,以获得以下内容:
31947 [AWT-EventQueue-0] ERROR Java.io.FileNotFoundException: so.txt
32204 [AWT-EventQueue-0] ERROR at java.io.FileInputStream.<init>(FileInputStream.java)
32235 [AWT-EventQueue-0] ERROR at ExTest.readMyFile(ExTest.java:19)
32370 [AWT-EventQueue-0] ERROR at ExTest.main(ExTest.java:7)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
try {
...
} catch (Exception e) {
final String s;
... // <-- What goes here?
log.error( s );
}
Run Code Online (Sandbox Code Playgroud)
ska*_*man 253
您将异常直接传递给记录器,例如
try {
...
} catch (Exception e) {
log.error( "failed!", e );
}
Run Code Online (Sandbox Code Playgroud)
由log4j来渲染堆栈跟踪.
您还可以将堆栈跟踪作为字符串通过ExceptionUtils.getStackTrace.
我只是用它log.debug来保持log.error简单.
如果要在不涉及异常的情况下记录堆栈跟踪,请执行以下操作:
String message = "";
for(StackTraceElement stackTraceElement : Thread.currentThread().getStackTrace()) {
message = message + System.lineSeparator() + stackTraceElement.toString();
}
log.warn("Something weird happened. I will print the the complete stacktrace even if we have no exception just to help you find the cause" + message);
Run Code Online (Sandbox Code Playgroud)
来自 skaffman 的答案绝对是正确的答案。所有记录器方法,例如error(), warn(), info(),都debug()将 Throwable 作为第二个参数:
try {
...
} catch (Exception e) {
logger.error("error: ", e);
}
Run Code Online (Sandbox Code Playgroud)
但是,您也可以将堆栈跟踪提取为字符串。有时,如果您希望使用“{}”占位符来利用格式化功能,这可能很有用 - 请参阅方法void info(String var1, Object... var2);在这种情况下,假设您有一个作为字符串的堆栈跟踪,那么您实际上可以执行以下操作:
try {
...
} catch (Exception e) {
String stacktrace = TextUtils.getStacktrace(e);
logger.error("error occurred for usename {} and group {}, details: {}",username, group, stacktrace);
}
Run Code Online (Sandbox Code Playgroud)
这将在最后以与方法相同的方式打印参数化消息和堆栈跟踪: logger.error("error: ", e);
我实际上写了一个开源库,它有一个实用程序,用于将堆栈跟踪提取为字符串,并带有一个选项,可以从堆栈跟踪中巧妙地过滤掉一些噪音。即,如果您指定您对提取的堆栈跟踪感兴趣的包前缀,则会从一些不相关的部分中过滤掉,并为您留下非常大的信息。这是文章的链接,该链接解释了该库具有哪些实用程序以及从何处获取它(作为 maven 工件和 git 源)以及如何使用它。具有堆栈跟踪过滤、Silent String 解析 Unicode 转换器和版本比较的开源 Java 库 参见段落“堆栈跟踪噪声过滤器”
只是因为它发生在我身上并且可能有用。如果你这样做
try {
...
} catch (Exception e) {
log.error( "failed! {}", e );
}
Run Code Online (Sandbox Code Playgroud)
您将获得异常的标头,而不是整个堆栈跟踪。因为记录器会认为你在传递一个字符串。不要{}像斯卡夫曼所说的那样做
在 Log4j 2 中,您可以使用Logger.having()来记录捕获的异常的堆栈跟踪。
try {
String msg = messages[messages.length];
logger.error("An exception should have been thrown");
} catch (Exception ex) {
logger.catching(ex);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
127522 次 |
| 最近记录: |