如何将完整的堆栈跟踪写入日志?

Lin*_*inc 19 java stack-trace

我正在捕获异常并尝试将堆栈跟踪写入日志,如下所示:

log.warn(e.getMessage());
Run Code Online (Sandbox Code Playgroud)

但它说的都是

null
Run Code Online (Sandbox Code Playgroud)

所以我改成了

log.warn(e.toString());
Run Code Online (Sandbox Code Playgroud)

现在只说了

java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

如何将完整堆栈跟踪写入日志,以便我可以看到应用程序中生成此异常的位置?

Pet*_*aný 34

通常:

log.warn("message", e);
Run Code Online (Sandbox Code Playgroud)

但这也取决于您的日志框架.


nis*_*ant 7

如果您使用 Java 8,您可以执行以下操作:

LOGGER.error("Caught exception while methodX. Please investigate: " 
    + exception 
    + Arrays.asList(exception.getStackTrace())
    .stream()
    .map(Objects::toString)
    .collect(Collectors.joining("\n"))
);
Run Code Online (Sandbox Code Playgroud)

  • Arrays.asList(...).stream() 可以简化为 Arrays.stream(e.getStackTrace()) (3认同)

Jos*_*tha 5

使用 log4j,这是通过以下方式完成的:

logger.error("An error occurred", exception);
Run Code Online (Sandbox Code Playgroud)

第一个参数是要显示的消息,第二个参数是记录堆栈跟踪的异常(可抛出)。

另一种选择是 commons-logging,它是相同的:

log.error("Message", exception);
Run Code Online (Sandbox Code Playgroud)

使用 java.util.logging 这可以通过以下方式完成:

logger.log(Level.SEVERE, "Message", exception);
Run Code Online (Sandbox Code Playgroud)