日誌用來記錄用戶操做、系統運行狀態等,是一個系統的重要組成部分。然而,因爲日誌一般不屬於系統的核心功能,因此經常不被團隊成員所重視。對於一些簡單的小程序,可能並不須要在如何記錄日誌的問題上花費太多精力。可是對於做爲基礎平臺爲不少產品提供服務的後端程序,就必需要考慮如何依靠良好的日誌來保證系統可靠的運行了。小程序
好的日誌能夠幫助系統的開發和運維人員:
1. 瞭解線上系統的運行狀態
2. 快速準肯定位線上問題
3. 發現系統瓶頸
4. 預警系統潛在風險
5. 挖掘產品最大價值後端
日誌應該很少很多,可以從日誌中獲得全部須要的信息。在實踐中常常發生日誌不夠的狀況,例如:1)請求出錯時不能經過日誌直接來定位問題,而須要開發人員再臨時增長日誌並要求請求的發送者從新發送一樣的請求才能定位問題;2)沒法肯定服務中的後臺任務是否按照指望執行;3)沒法肯定服務的內存數據結構的狀態;4)沒法肯定服務的異常處理邏輯(如重試)是否正確執行;5)沒法肯定服務啓動時配置是否正確加載;
示例:
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, ErrorCode:1426, Message: callback request (to http://example.com/callback) failed due to socket timeout
緩存
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) timeout ... 1 try
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) timeout ... 2 try
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) success
要好於:[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth request (to http://auth1.example.com/v2) success
由於前者可讓咱們預判被依賴的服務器服務質量有風險,也許須要進行擴容;日誌中須要記錄關鍵參數,出錯時的關鍵緣由等。服務器
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth failed
[INFO] RequestID:b1946ac92492d2347c6235b4d2611185, content digest does not match
[INFO] RequestID:b1946ac92492d2347c6235b4d2611186, request ip not in whitelist
就不如:
[INFO] RequestID:b1946ac92492d2347c6235b4d2611184, auth failed due to token expiration
[INFO] RequestID:b1946ac92492d2347c6235b4d2611185, content digest does not match, expect 7b3f050bfa060b86ba781151c563c953, actual f60645e7107917250a6408f2f302d048
[INFO] RequestID:b1946ac92492d2347c6235b4d2611186, request ip(=202.17.34.1)
一個系統一般經過RequestID來對請求進行惟一的標記,目的是能夠經過RequestID將一個請求在系統中的執行過程串聯起來。該RequestID一般會隨着響應返回給調用者,若是調用出現問題,調用者也能夠經過提供RequestID幫助服務提供者定位問題網絡
RequestId的生成:數據結構