日誌記錄原則以及logback高階用法

2021-10-08 21:46:54 字數 2791 閱讀 2377

1、良好的日誌有助於快速定位問題,但是記錄日誌很容易臃腫膨脹,記錄無用資訊。

2、良好的日誌,也是後續進行全鏈路跟蹤的分析介質。

3、為自己工作,為自己的系統工作,做自己的老闆,形成正迴圈:打磨當前工作的核心關鍵能力——>高效能工作——>更多時間打磨自己的系統——>更高效能工作——>打磨下個層次工作的核心關鍵能力……

4、核心競爭力,是指你擁有的(獨特的)知識經驗組合,經過你思維邏輯的組織梳理,在實踐中產生無可替代的價值。打造自己的tms系統(t:專業技術;m:溝通管理、s:行業解決方案),利用複利效應,讓系統為自己工作。

目前常用的日誌框架是logback、log4j2這兩個。

logback是在log4j的基礎上進行的公升級,而log4j2是參考logback的長處進行的公升級。

log4j2號稱效能提公升巨大。

不過目前還是選擇logback框架,首先是目前記錄日誌並沒有影響tps,另外springboot等開源框架都在使用logback,如果不是極端情況還是使用logback。

logback的基礎用法,不再贅述,請讀者自行搜尋。

當然,為了很快的替換,應用中應該使用slf4j這個日誌facade模式框架,而不是具體的實現。

具體來說,logger的宣告,使用slf4j的類宣告。

日誌,是用來查詢問題的。

應用日誌的核心目標,就是發現問題時,進行查詢搜尋。

以此定位的話,有下面幾個原則

日誌內容,盡量少而完整

首先是通過配置,日誌框架就可以記錄的靜態內容:時間、日誌級別、執行緒、class路徑等。

最主要的是:上下文資訊

例如,如果報錯error日誌,要記錄入參、詳細的報錯異常堆疊、核心中間資料等。

達到乙個目標,就是通過日誌資訊,可以很快的還原現場,不需要再人工去梳理推斷流轉到此處**的邏輯資訊。

初級程式設計師往往直接把exception扔列印方法裡面,導致日誌中只有報錯現象,而沒有資料。

難以分析。

日誌時機

首先是:異常、錯誤等地方使用error級別日誌。

其次,核心元件的關鍵動作使用info級別日誌。

第三,可以容錯的處理,記錄warn級別日誌。

日誌格式

格式一般是在logback.xml配置檔案中配置。

可以按照企業內部要求,或者結合應用介面彙總涉及到的字段來記錄。

日誌分析

日誌要經常分析。對於error級別日誌,重點考慮,分析原因;對於warn級別日誌,檢視容錯處理的情況,是否可以避免;對於info級別的日誌,是否有必要,是否可以不記錄?目前日誌的讀寫到檔案,需要占用i/o資源,最好盡可能的少。

介紹一些logback提供的功能,藉以封裝實現個性化需求。

​ logback的contextlistener日誌系統初始化

我們需要在logback中做一些動態配置,比如日誌等級、輸出路徑等,這些資訊可以存放在資料庫中,啟動時載入,可以用logback自帶的contextlistener。

public

class

loggerstartuplistener

extends

contextawarebase

implements

loggercontextlistener

, lifecycle

然後配置到logback.xml中,日誌系統初始化之前就會使用這個個性化的listener

class

="com.…….loggerstartuplistener"

/>

logback的封裝使用(如果效能要求高,不推薦)

下面是普通的日誌方式:

private

final

static logger logger = logge***ctory.

getlogger

class);

logger.

debug

("what"

)

但是每乙個類都這麼寫,真是非常繁瑣。

可以做一下如下的封裝,logger做乙個靜態工具類使用:

class logtoolfactory  catch (classnotfoundexception e) 

} /**

* 通過堆疊,獲取呼叫者類名

* @param clazz 被呼叫者class

* @return 呼叫者類名

*/private static string getinvokerclassname(class clazz)

public

static

void

trace

(string msg)

……

但是,使用了stacktraceelement stacktrace = thread.currentthread().getstacktrace();

在交易量非常大的情況下,會有效能問題。

對於普通的應用可以嘗試。

記憶體對齊的原則以及作用

首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include 45 using namespace std 6 7struct st1 8 13 14struct st2 15 20 21int main 22 27 程式的輸出結果為 sizeof st1 is 12...

記憶體對齊規則以及作用

首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include 45 using namespace std 6 7struct st1 8 13 14struct st2 15 20 21int main 22 27 程式的輸出結果為 sizeof st1 is 12...

記憶體對齊的規則以及作用

首先由乙個程式引入話題 include using namespace std struct st1 struct st2 int main cout 程式的輸出結果為 sizeof st1 is 12 sizeof st2 is 8 問題出來了,這兩個一樣的結構體,為什麼sizeof的時候大小不一...