簡體   English   中英

您如何將完整的堆棧跟蹤寫入日志?

[英]How do you write a full stack trace to the log?

我正在捕獲異常並嘗試將堆棧跟蹤寫入日志,如下所示:

log.warn(e.getMessage());

但它所說的只是

null

所以我把它改成

log.warn(e.toString());

現在它只說

java.lang.NullPointerException

如何將完整的堆棧跟蹤寫入日志,以便我可以看到在應用程序中生成此異常的位置?

通常:

log.warn("message", e);

但這也取決於您的日志記錄框架。

你可以使用

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

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

資源:

使用 log4j,這是通過以下方式完成的:

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

第一個參數是要顯示的消息,第二個參數是記錄堆棧跟蹤的異常(可拋出)。

另一種選擇是 commons-logging,它是相同的:

log.error("Message", exception);

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

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

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

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

在您的異常方法中,包含消息的基礎Stringnull

上面的答案,現在被剔除,仍然成立,除了e不為 null,但Throwable類上的detailMessage私有實例變量為 null,這就是為什么e.getMessage()是 String null ,而e.toString() (調用底層null detailMessage.toString )拋出NullPointerException

如果你使用的是 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")));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM