java日誌規約

日誌目標

  1. 瞭解系統運行狀態:標識程序運行中的危險操作、錯誤操作,進而便於在出現問題時排查問題
  2. 發現潛在性能問題:通過日誌提供的詳細執行時間記錄來定位在開發階段難以發現的性能瓶頸
  3. 實時監控預警:針對關鍵性異常、bug等錯誤進行實時跟蹤和預警,避免問題擴大
  4. 價值數據分析:記錄對於後續業務或系統分析有價值的數據,例如埋點數據等

日誌規約

【強制】不打無用的、無意義、不完全的日誌。

【強制】日誌打印的時候不能因爲打印日誌引入新的異常,例如打印一個可能爲null的對象的屬性。
【強制】使用門面模式的日誌框架來打印日誌,有利於維護和各個類的日誌處理方式統一。
		例如在Java中應使用slf4j來記錄日誌而非直接使用log4j
		
【強制】使用參數化信息的方式打印日誌,避免使用字符串拼接形式,
		這樣將會產生很多的非必要的字符串對象,影響性能。
		
【強制】應用中的擴展日誌(如打點、臨時監控、訪問日誌等)命名方式:appName_logType_logName.log。
		logType:日誌類型,推薦分類有 stats/desc/monitor/visit 等;
		logName:日誌描述;這種命名的好處是通過文件名就可知 道日誌文件屬於什麼應用,什麼類型,什麼目的,也有利於歸類查找。
		
【強制】日誌文件推薦至少保存 15 天,因爲有些異常具備以“周”爲頻次發生的特點。

【強制】避免重複打印日誌,浪費磁盤空間,禁止在一個遞歸程序或未知循環次數的循環體中打印日誌
		以造成磁盤空間佔滿風險增加。
		
【強制】異常信息應該包括兩類信息:案發現場信息和異常堆棧信息,如果不處理,那麼通過關鍵字 throws 往上拋出。

【強制】生產環境只開啓info級別以上的日誌。

日誌內容

  • 重要的啓動配置
  • 對持久化數據的更改
  • 系統主要組件間的請求和響應
  • 非常重要的狀態轉換
  • 重要的邏輯分支判斷
  • 系統性異常、崩潰信息

java日誌打印最佳實踐(SLF4J爲例)

  • 日誌打印需依賴使用日誌框架SLF4J 中的 API,使用門面模式的日誌框架,且在一個對象中通常只使用一個Logger對象,Logger應該是static final
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger LOGGER = LoggerFactory.getLogger(ClassName.class);

  • 不打印重複的日誌,避免重複打印日誌,浪費磁盤空間,務必在logback.xml中設置 additivity = false
<logger name="com.spring.cloud.dao" level="DEBUG" additivity="false"></logger>
  • 合理使用日誌級別,對不同日誌進行分文件、分級輸出,便於後續日誌的統一管理、清理,並增強問題排查的效率。
    Java的日誌框架一般會提供以下日誌級別,缺省打開info級別,也就是debug,trace級別的日誌在生產環境不會輸出,在開發和測試環境可以通過不同的日誌配置文件打開debug級別。
fatal - 嚴重的,造成服務中斷的錯誤;
error - 其他錯誤運行期錯誤,在各方法的catch塊中使用;
warn - 警告信息,如程序調用了一個即將作廢的接口,接口的不當使用,運行狀態不是期望的但仍可繼續處理等;
info - 有意義的事件信息,如程序啓動,關閉事件,收到請求事件等;
debug - 調試信息,可記錄詳細的業務處理到哪一步了,以及當前的變量狀態;
trace - 更詳細的跟蹤信息。

  • 使用參數化信息的方式:不要進行字符串拼接,那樣會產生很多String對象,佔用空間,影響性能。
LOGGER.debug("Processing trade with id: [{}], symbol: [{}]", id, symbol);

日誌級別

優先級由高到低:OFF>FATAL>ERROR>WARN>INFO>DEBUG>ALL

引用文章:https://www.cnblogs.com/zyybb/p/10535735.html


ALL:最低等級的,用於打開所有日誌記錄。

TRACE: 很低的日誌級別,一般不會使用。

DEBUG: 指出細粒度信息事件對調試應用程序是非常有幫助的,主要用於開發過程中打印一些運行信息。

INFO:  消息在粗粒度級別上突出強調應用程序的運行過程。
		打印一些你感興趣的或者重要的信息,這個可以用於生產環境中輸出程序運行的一些重要信息,
		但是不能濫用,避免打印過多的日誌。

WARN: 表明會出現潛在錯誤的情形,有些信息不是錯誤信息,但是也要給程序員的一些提示。

ERROR: 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
		打印錯誤和異常信息,如果不想輸出太多的日誌,可以使用這個級別。

FATAL: 指出每個嚴重的錯誤事件將會導致應用程序的退出。
		這個級別比較高了。重大錯誤,這種級別你可以直接停止程序了。

OFF: 最高等級的,用於關閉所有日誌記錄。

如果將log level設置在某一個級別上,那麼比此級別優先級高的log都能打印出來。
	例如,如果設置優先級爲WARN,那麼OFF、FATAL、ERROR、WARN 4個級別的log能正常輸出,
	而INFO、DEBUG、TRACE、 ALL級別的log則會被忽略。
	Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。

從我們實驗的結果可以看出,log4j默認的優先級爲ERROR或者WARN(實際上是ERROR)。

一些其他建議

  1. 推薦利用Spring AOP切面配置打印每個方法的耗時,有利於後續代碼的性能問題定位和優化;
  2. 業務日誌內容應儘量使用業務語言進行表達而非用程序語言表達,這樣做的好處是能夠從日誌反應業務流程,可讀性高,即便不是這段代碼的編寫人也可以讀懂;
  3. 涉及到資源類的使用,推薦關鍵性日誌,比如說磁盤訪問,比如數據庫訪問,比如請求網絡服務器,這些都算是與小系統的交互,必須要將輸入和輸出寫入日誌。而且這些內容都會伴有異常,遇到異常更是要以error寫入logger;
  4. 若業務涉及到跨系統或服務的交互,推薦在服務入口處(通常是消息總線或網關程序)生成請求鏈路ID(TraceID),後續在所有日誌打印中通過框架自動把TraceID打印出來,有利於問題的快速排查和定位;
  5. 推薦日誌打印格式爲:時間(毫秒粒度)[日誌級別] [機器名(IP)] [類名(全路徑).方法名] [TraceID] [線程名] 日誌內容
  6. 日誌打印應設置通過日期和文件大小雙重滾動,確保每個日誌文件的大小可控,日誌文件名中需要帶入日期,便於後續日誌的歸檔和清理;
  7. 日誌文件合理分類,一般主要分爲業務、性能、錯誤、埋點、其他等類型,將這些類型的日誌分文件輸出有助於日誌歸集、分析和管理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章