關於日志記錄的一些感想


關於日志記錄的一些感想

剛剛我們組的產品經理和法務部的同事找我,說公司正在和某個客戶打官司。為了反駁客戶的某一些說辭,需要我幫忙找一找某個客戶的某一份合同文件的操作日志。也就是:

需要確定就是這個客戶在某一天的某個時間進入我們的某個系統進行了「合同簽署」這個操作

事后我想了一下,里面確實有很多我們平時設計系統,實現系統功能時需要注意的一些點,所以我基於我目前的眼界和經驗,總結一下,希望對大家有所幫助,爭取不浪費讀者朋友們的寶貴的時間。

日志的輸出

我覺的最基本的但是也是最重要的事情就是日志的輸出。因為沒有日志輸出也就沒有下面要說的「存儲收集」和「查詢展示」了。

我不確定讀者所在的格式是否有日志規范,我覺的有一份好的日志規范還是很重要的,但是最重要的還是有效的執行下去。

統一日志框架

Java里存在眾多的開源日志框架,比如:slf4j, logback, log4j, JCL(Apache Common Logging), JUL(JDK自帶的java.util.logging)

我一般都采用SLF4J這個框架,因為它的API很簡潔。其實它並不包含日志的實現,而僅僅是提供了眾多的適配器來適配其他所有開源的日志框架,這就使得我們在代碼中只需要面對SLF4J的API,然后可以任意的切換實現。

也許你們並不需要切換日志框架的實現這個功能,但往往我們的項目都會依賴很多的第三方的開源框架,而這些第三方的開源框架有可能采用不同的日志框架,而不同的日志框架可能需要的配置也不盡相同,不同的配置又可能導致日志輸出到不同的位置,這就很不方便我們后續的日志收集和管理。

為了方便我們將日志統一收集和管理起來,我們可以使用slf4j的適配器將第三方庫中各種日志的實現接管,接管之后就可以統一配置這些第三方庫中使用的日志了。

logback的性能又非常的好,所以我就選擇了logback作為我的日志實現了。

日志的級別

日志有:TRACE, DEBUG, INFO, WARN, ERROR, FATAL這幾個隔離級別。

一定要用好日志級別。我的習慣和理解如下:

  • TRACE 一般情況下我會用來記錄業務日志
  • WARN 我一般會在出現了異常情況,但是又在業務的合理范圍之類的時候我會適應warn
  • INFO 一般非常重要的日志,關鍵系統參數的回顯、后台服務的初始化狀態、需要開發者確認的信息我都會適應INFO這個級別。
  • DEBUG 詳細的記錄流程的關鍵路徑,這種級別的日志是為了方便我們開發和調試系統功能的,在生產環境默認是關閉的。
  • ERROR 系統出現了異常情況的時候時候
  • FATAL 說實話我沒有用過,我都用ERROR代替了。

日志的格式和分類

統一定義日志文件的名稱,日志內容的格式,可以極大的方便后續日志的收集和解析工作。

大的指導原則是:

  • INFO 及以上的系統日志統一輸出到Console
  • 業務日志、系統日志、異常日志分別輸出到不同的文件中,更加方便異常問題的排查

不同類型的系統或者模塊對不同功能的日志的側重是不一樣的

根據系統使用場景不同,對日志的側重點就不一樣。導致這些不同側重點的原因可能有:

  • 排查問題的需要
  • 來自審計部門的需要
  • 數據挖掘的需要
  • 為了避免糾紛(這個挺重要的)
  • 。。。。。

比如我們做兩個系統,一個是「權限管理系統」,另外一個是「信息通知系統」,干一些發郵件,短信等的消息。前者我們需要詳細的操作日志,記錄「誰在某年某月某日為某人分配了什么權限」,因為審計部門需要。而后者即便發送出錯了,重試或者忽略都可以考慮,甚至都不需要記錄任何的日志。

系統可能有點大,系統中的一些模塊、重要接口對日志的要求也很高,比如我文章開頭舉得例子,代理商說合同我沒有簽訂,死不承認。這個時候怎么辦呢,只能找當時的系統日志來說了。假設當時系統沒有輸出日志,或者輸出的日志信息對於打官司一點用都沒有,那么就比較尷尬了。

日志輸出的注意點

我不確定大家是否遇到過下面的情況:*排查問題時,發現那塊出現錯誤的地方有日志輸出,但是輸出的日志對於排查問題一點用都沒有**,每當出現這種情況的時候我都想罵人。

好的日志需要有哪些內容呢?

  • 發生時間
  • 出現問題的線程
  • 日志級別
  • 出現問題的類文件,類的哪一行,異常棧
  • 程序入參
  • 相應的程序員的注釋等

重要API,系統間交互等地方是加日志,監控的重點位置

臨時想到一個,就是日志輸出時,盡量輸出一些「不可變的或者唯一」的信息。舉個例子:

為了在日志中記錄某個用戶的行為,但是用戶的身份可以用自己生成的userId,手機號,身份證號,昵稱等。

考慮到昵稱和手機號可能會變化,所以使用這兩個來在日志中表示用戶身份可能就不合適了。也許查詢一年前的日志是,但是記錄的手機號已經不屬於這個用戶了。

日志的存儲與收集

關於日志的存儲方式,無論是使用MySQL,Elasticsearch,HDFS等,都已經很有多的文章和教程了,我就不詳細提了。

主要需要注意點是:日志的存儲時需要了解清楚日志存儲的作用,然后按照某些維度來組織,比如時間,比如操作人等,方便后續聚合、查詢,分析等。

另外還需要注意的是日志的存儲時間,如果你們的日志是永久存儲的話,當我沒說哈。一般公司會為了節省存儲空間成本,會定期刪除一些日志,這個時候需要根據日志的重要性確定是否永久存儲,或者定期刪除的時間長短。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM