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

时间:2010-09-15 11:45:35

标签: java stack-trace

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

log.warn(e.getMessage());

但它说的只是

null

所以我把它改成了

log.warn(e.toString());

现在只说

java.lang.NullPointerException

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

7 个答案:

答案 0 :(得分:34)

一般:

log.warn("message", e);

但这也取决于你的日志框架。

答案 1 :(得分:9)

您可以使用

logger.log(Level.WARN, "logged exception", ex);

logger.warn("logged exception", ex);

资源:

答案 2 :(得分:4)

使用log4j完成:

logger.error("An error occurred", exception);

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

另一个选项是commons-logging,它是相同的:

log.error("Message", exception);

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

logger.log(Level.SEVERE, "Message", exception);

答案 3 :(得分:3)

在您的异常方法中,包含该消息的基础Stringnull

上面的答案,现在已经删除了,除了e不为空,但detailMessage类上的Throwable私有实例变量为空,这就是为什么{ {1}}是字符串e.getMessage(),但null(调用底层 null e.toString())会抛出detailMessage.toString

答案 4 :(得分:2)

如果您使用java8,则可以执行以下操作:

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

答案 5 :(得分:1)

也许你正在寻找这样的东西: http://www.javapractices.com/topic/TopicAction.do?Id=78

答案 6 :(得分:0)

如果您使用的是8之前的Java版本,可以试试这个:

            LOGGER.error("Error al recuperar proveedores de la base de datos: " + 
            e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){
                    @Override
                    public Object apply(Object t) {
                        return t.toString();
                    }
                }).collect(Collectors.joining("\n")));