程式中記錄日誌一般有兩個目的:troubleshooting和顯示程式執行狀態。好的日誌記錄方式可以提供我們足夠多定位問題的依據。
這周看過很多**,對裡面的日誌記錄方式有些想法,今天是週末,也想總結下我對這個問題的看法。日誌記錄大家都會認為簡單,但如何通過日誌可以高效定位問題可不是簡單的事情。這裡我會寫下面三個方面的內容,主要是舉例為主,提醒我以後得注意這些方面
方便troubleshooting的日誌:
對外部的呼叫封裝:
程式中對外部系統與模組的依賴呼叫前後都記下日誌,方便介面除錯。出問題時也可以很快理清是哪塊的問題
狀態變化:
程式中重要的狀態資訊的變化應該記錄下來,方便查問題時還原現場,推斷程式執行過程
boolean isrunning;
isrunning = true;
log.info("system is running");
//...
isrunning = false;
log.info("system was interrupted by " + thread.currentthread().getname());
系統入口與出口:
這個粒度可以是重要方法級或模組級。記錄它的輸入與輸出,方便定位
void execute(object input)
業務異常:
任何業務異常都應該記下來
try catch (ioexception e) catch (busines***ception e) catch (exception e)
void invoke(object primaryparam)
} 非預期執行:
為程式在「有可能」執行到的地方列印日誌。如果我想刪除乙個檔案,結果返回成功。但事實上,那個檔案在你想刪除之前就不存在了。最終結果是一致的,但程式得讓我們知道這種情況,要查清為什麼檔案在刪除之前就已經不存在呢
int myvalue = ***x;
int absresult = math.abs(myvalue);
if (absresult < 0)
很少出現的else情況:
else可能吞掉你的請求,或是賦予難以理解的最終結果
object result = null;
if (running) else
程式執行狀態
程式在執行時就像乙個機械人,我們可以從它的日誌看出它正在做什麼,是不是按預期的設計在做,所以這些正常的執行狀態是要有的。
程式執行時間:
long starttime = system.currenttime();
// business logical
log.info("execution cost : " + (system.currenttime() - starttime) + "ms");
大批量資料的執行進度
:
log.debug("current progress: " + (currentpos * 100 / totalamount) + "%");
關鍵變數及正在做哪些重要的事情:
執行關鍵的邏輯,做io操作等等
string getjvmpid()
void invokeremotemethod(object params)
避免的日誌方式
無意義的log:
日誌不包含有意義的資訊: 你肯定想知道的是哪個檔案不存在吧
file file = new file("***");
if (!file.i***ist())
logback打日誌正確姿勢
logback動態修改包名的日誌級別 param level 日誌級別 param packagename 包名 return public string updatelogbacklevel requestparam value level string level,requestparam va...
Java日誌正確使用姿勢
前言 關於日誌,在大家的印象中都是比較簡單的,只須引入了相關依賴包,剩下的事情就是在專案中 盡情 的列印我們需要的資訊了。但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的bug發生,作為一名嚴謹的程式設計師,怎麼能讓這種事情發生呢?所以下面我們就來了解一下關於日誌的那些正確使用姿勢。正文 ...
Java日誌正確使用姿勢
前言 關於日誌,在大家的印象中都是比較簡單的,只須引入了相關依賴包,剩下的事情就是在專案中 盡情 的列印我們需要的資訊了。但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的bug發生,作為一名嚴謹的程式設計師,怎麼能讓這種事情發生呢?所以下面我們就來了解一下關於日誌的那些正確使用姿勢。正文日...