摘要:我們?cè)诰帉懸恍┙M件時(shí),使用的日志系統(tǒng)有時(shí)并不能打印完整的堆棧信息,比如我們?cè)谡{(diào)用打印異常時(shí),只打印一行異常信息。
Java print full StackTrace
我們?cè)诰帉懸恍┙M件時(shí),使用的日志系統(tǒng)有時(shí)并不能打印完整的堆棧信息,比如slf4j,log4j,我們?cè)谡{(diào)用log.error("found error ...",e)打印異常時(shí),只打印一行異常信息。我們看下slf4j的源碼
/** * Log an exception (throwable) at the ERROR level with an * accompanying message. * * @param msg the message accompanying the exception * @param t the exception (throwable) to log */ public void error(String msg, Throwable t);
它在打印exception時(shí),只是打印了堆棧當(dāng)中的第一行Throwable的信息, 而我們想要的是把整個(gè)堆棧都打印出來(lái),這時(shí)我們會(huì)用下面方式打印堆棧信息。
e.printStackTrace()
這雖然打印了完整的堆棧信息,但它并不會(huì)把堆棧信息定向到日志文件中,這時(shí)我們就需要利用利用輸出流把信息重新定到變量中,然后再送入到日志系統(tǒng)中
/** * 完整的堆棧信息 * * @param e Exception * @return Full StackTrace */ public static String getStackTrace(Exception e) { StringWriter sw = null; PrintWriter pw = null; try { sw = new StringWriter(); pw = new PrintWriter(sw); e.printStackTrace(pw); pw.flush(); sw.flush(); } finally { if (sw != null) { try { sw.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (pw != null) { pw.close(); } } return sw.toString(); }
然后我們這樣調(diào)用就解決了這個(gè)問(wèn)題
log.error("fount error...", getStackTrace(e))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64674.html
摘要:指的是占用了一個(gè)核心,兩個(gè)核心是,以此類推。占用率及對(duì)應(yīng)進(jìn)程可以通過(guò)命令確定,在界面按顯示完整的命令行參數(shù),按顯示每個(gè)核心的統(tǒng)計(jì)數(shù)據(jù)。查看線程堆棧,找到對(duì)應(yīng)的類及行號(hào),然后閱讀代碼查找可能的問(wèn)題原因。 100%指的是占用了CPU一個(gè)核心,兩個(gè)核心是200%,以此類推。CPU占用率及對(duì)應(yīng)進(jìn)程ID(pid)可以通過(guò)top命令確定,在top界面按 c (顯示完整的命令行參數(shù)),按 1 (顯示...
摘要:一內(nèi)存調(diào)優(yōu)主要的目的是減小的頻率和的次數(shù)。調(diào)優(yōu)工具之主要用來(lái)輸出中運(yùn)行的進(jìn)程狀態(tài)信息。調(diào)優(yōu)工具之和用來(lái)查看堆內(nèi)存使用狀況,一般結(jié)合使用。 一、jvm內(nèi)存調(diào)優(yōu) 主要的...
摘要:但是往往越簡(jiǎn)單的東西越容易讓我們忽視,從而導(dǎo)致一些不該有的發(fā)生,作為一名嚴(yán)謹(jǐn)?shù)某绦騿T,怎么能讓這種事情發(fā)生呢所以下面我們就來(lái)了解一下關(guān)于日志的那些正確使用姿勢(shì)。級(jí)別表示出現(xiàn)了嚴(yán)重錯(cuò)誤,程序?qū)?huì)中斷執(zhí)行。 前言 關(guān)于日志,在大家的印象中都是比較簡(jiǎn)單的,只須引入了相關(guān)依賴包,剩下的事情就是在項(xiàng)目中盡情的打印我們需要的信息了。但是往往越簡(jiǎn)單的東西越容易讓我們忽視,從而導(dǎo)致一些不該有的bug發(fā)...
摘要:線程堆棧最擅長(zhǎng)與分析如下類型問(wèn)題系統(tǒng)無(wú)緣無(wú)故過(guò)高。性能瓶頸如無(wú)法充分利用等線程死鎖死循環(huán),餓死等。由于線程數(shù)量太多導(dǎo)致系統(tǒng)失敗如無(wú)法創(chuàng)建線程等。注意死鎖的兩個(gè)或多個(gè)線程是不消耗的,有的人認(rèn)為的使用率是線程死鎖導(dǎo)致的,這個(gè)說(shuō)法是完全錯(cuò)誤的。 不知覺(jué)間工作已有一年了,閑下來(lái)的時(shí)候總會(huì)思考下,作為一名Java程序員,不能一直停留在開發(fā)業(yè)務(wù)使用框架上面。老話說(shuō)得好,機(jī)會(huì)是留給有準(zhǔn)備的人的,因此...
摘要:對(duì)于引擎來(lái)說(shuō),兩者獲取堆棧的方式是不同的。對(duì)于引擎來(lái)說(shuō),堆棧信息附加在了函數(shù)所返回的并在鏈中傳遞,這樣函數(shù)也能在需要的時(shí)候獲取堆棧信息。使用可以實(shí)時(shí)監(jiān)控線上應(yīng)用的錯(cuò)誤,并獲取完整的堆棧信息。 譯者按: Async/Await真的只是簡(jiǎn)單的語(yǔ)法糖嗎?No! 原文:Asynchronous stack traces: why await beats .then() 作者: Math...
閱讀 2110·2023-04-26 00:09
閱讀 3139·2021-09-26 10:12
閱讀 3508·2019-08-30 15:44
閱讀 2874·2019-08-30 13:47
閱讀 935·2019-08-23 17:56
閱讀 3242·2019-08-23 15:31
閱讀 489·2019-08-23 13:47
閱讀 2527·2019-08-23 11:56