日誌實踐:門面日誌&日誌系統 SLF4J&LOG4J

日誌實踐:門面日誌框架&日誌系統

相關概念和介紹

  1. 系統日誌 ,記錄系統中硬件、軟件和系統問題的信息,同時還可以監視系統中發生的事件。用戶可以通過它來檢查錯誤發生 的原因,或者尋找受到攻擊時攻擊者留下的痕跡。系統日誌包括系統日誌、應用程序日誌和安全日誌。 圖片:日誌使用的作用、使用人員、使用場景和記錄的內容
  2. 日誌系統 ,日誌的具體實現,如:Log4J、LogBack、Loggin等日誌系統 。
    多種日誌系統的存在,出現了日誌系統的兼容問題,爲了解決這個問題,日誌框架應運而生。
  3. 常用日誌框架:
    Common-logging是apache提供的一個通用日誌接口,只是規定了日誌的接口規範,主流的日誌系統都實現了commons-logging定義的接口;
    SLF4J即:java簡單日誌門面。slf4j不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。SLF4J是一個用於日誌系統的簡單Facade,允許最終用戶在部署其應用時使用其所希望的日誌系統
  4. 日誌系統和日誌框架經典搭配舉例:
    Log4j + commons-logging
    logback + slf4j
    log4j + slf4j

日誌實踐案例

應用是多個包project關聯引用的,如今加入一個新的功能包,search project。
應用原日誌情況:應用包 已經使用了日誌系統Log4J;新的功能作爲一個新加的包project缺少日誌記錄功能
日誌改造目的:給新加的search project加上日誌記錄的功能,而且不影響原本舊的應用其他包的日誌功能。
技術選型及原因:考慮到不同項目project甚至第三方包存在不同的日誌系統,存在兼容性問題,因此,選用日誌框架SLF4J 和 日誌系統Log4J的組合。
應用新日誌情況

  1. search project 引入相關的jar包【slf4j和log4j用到的jar包】
  2. 添加日誌配置文件log4j.xml【具體實現是log4j,所以日誌配置等都是log4j的使用】
  3. 代碼關鍵位置、需要記錄日誌的位置 添加 日誌記錄代碼 【代碼引入使用引入的類要用slf4j的類】
  4. search project自身測試是否能夠記錄日誌。如成功
  5. 日誌配置文件內容複製到應用的log4j.xml,刪除搜索引擎的log4j.xml
  6. 應用測試日誌記錄。
    SLF4J : 不是具體的日誌解決方案,它只服務於各種各樣的日誌系統;
    Log4J 纔是日誌的真正實現。Log4J的三個組件:記錄器logger、追加器appender、佈局layout

    log4j.xml添加的日誌配置:
<!-- 配置search的日誌輸出目的,負責日誌的輸出 -->
	<appender name="search" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="./search.log" />
		<param name="Append" value="true" />
		<param name="Encoding" value="utf-8" />
		<param name="DatePattern" value="'.'yyyy-MM-dd" />
		<!-- 配置日誌格式化,以什麼形式展示-->
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d %-5p [%c] %m%n" />
		</layout>
	</appender>
	<!-- 配置search的日誌記錄器,如何處理日誌 -->
	<logger name="hy.search">
		<level value="DEBUG" />
		<appender-ref ref="search" />
		<appender-ref ref="CONSOLE" />
	</logger>

常用的幾種appender有:

org.apache.log4j.ConsoleAppender(控制檯)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)

使用指定的Layout來展示(格式化)日誌,常見的Layout有:

org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

ConversionPattern參數的格式含義:

格式名  		     含義   
%c        		 輸出日誌信息所屬的類的全名   
%f         		 輸出日誌信息所屬的類的類名      
%m        	     輸出代碼中指定的信息,如log(message)中的message   
%n         		 輸出一個回車換行符,Windows平臺爲“rn”,Unix平臺爲“n”   
%p         		 輸出優先級,即TRACE,DEBUG,INFO,WARN,ERROR,FATAL。

日誌代碼使用靜態變量還是實例變量?推薦 靜態變量

項目 優點 代碼案例
靜態變量 共用一個變量;CPU開銷更少:日誌記錄程序只在託管類初始化時檢索和分配一次;內存開銷更少:logger聲明將每個類使用一個引用。不支持注入 public static final Logger LOGGER = LoggerFactory.getLogger(“hy.search”);
實例變量 即使對於應用程序之間共享的庫,也可以利用存儲庫選擇器。但是,存儲庫選擇器僅在底層日誌記錄系統是logback-classic時纔有效。存儲庫選擇器不適用於SLF4J + log4j組合。[對象變量Logger支持注入,對於一個JVM中運行的多個引用了同一個類庫的應用程序,可以在不同的應用程序中對同個類的Logger進行不同的配置] Logger crawlerLogger = LogManager.getLogger(“hy.crawler”);

打印日誌語句舉例:

~Util.LOGGER.debug(“創建新的連接{}”, bean.getHost());
~Util .LOGGER.info(“添加成功!”);

日誌使用規範

參考阿里巴巴Java開發規範,如:

  1. 應用中不可以直接使用日誌系統的api,而應該依賴日誌框架SLF4j的api.
    Public static final Logger LOGGER=LoggerFactory.getLogger(“hy.search”);
  2. 對trace/debug/info級別的日誌輸出,必須使用條件輸出形式或者使用佔位符的形式.
    ServerUtil.LOGGER.debug(“JDBCUtil getConnection {}”, conn);

其他的日誌使用建議:

  1. 保證記錄日誌本身不能出錯.比如:logger.info()語句本身出現空指針異常
  2. 避免敏感信息,比如:用戶密碼、用戶個人信息等,在日誌裏應該只記錄用戶的唯一標識
  3. 記錄“不可能發生的事情”,在正常邏輯下,某些情況永遠不可能發生的,但是還是要給這些情況打印一些日誌。比如:條件語句裏的else;switch裏的default.[防禦式編程]

注意事項

記錄日誌的時機:

  1. 編程語言提示異常:如今各類主流的編程語言都包括異常機制,業務相關的流行框架有完整的異常模塊。根據實際結合業務的情況使用warn或者error級別。
  2. 業務流程預期不符:如外部參數不正確等問題,取決於開發人員的經驗。結合實際業務,使用WARN和ERROR級別日誌。
  3. 系統核心角色,組件關鍵動作:如用戶從登陸到交易完成的整個流程,各個服務節點間交互的位置,核心組件運行過程等。建議記錄INFO級別日誌。
  4. 系統及各模塊初始化:各個服務組件的啓動參數,狀態信息。建議INFO級別日誌記錄

日誌應該記錄什麼:

  1. when時間:日誌記錄的事件的發生時間;一個或一組事件的持續時間
  2. where地點:事件產生的地點,可以是模塊、文件、函數等,至少包含模塊信息。
  3. how怎麼樣(重要性):要有日誌等級,代表日誌的重要性、緊急程度
  4. what什麼:日誌主體內容,描述發生的事情,如:用戶登錄失敗!
  5. who誰:事件產生的唯一標誌,區分同樣的時間。如:用戶張三登錄失敗!
  6. context內容:專指高度依賴於具體的日誌內容的信息,用於定位問題的具體原因。如:用戶張三由於密碼錯誤登錄失敗!

日誌等級的使用:
FATAL:強制關閉服務或應用程序 以防止數據丟失的任何錯誤[這個一般會是最後一條日誌消息][服務掛了]
ERROR:[嚴重錯誤]任何對操作致命的錯誤[無法打開所需文件、缺少數據等等]。影響用戶的正常訪問,強制用戶[管理員或直接用戶]進行干預。通常是程序中保留不正確的連接符、缺少服務等。[服務活着但無法通提供正常服務]
WARN:[一般警告]任何可能導致應用程序錯誤的東西。[從主服務器切換到備份服務器,重試操作,丟失輔助數據…][不用馬上處理但是要及時處理]
INFO: [一般要顯示的信息]通常用於記錄有用的信息[服務啓動/停止,配置…] 始終可用但是通常在正常情況下不關心。開箱即用的配置級別。
DEBUG:[程序的調試信息]任何有助於跟蹤系統流程並隔離問題的信息,特別是在開發和質量測試階段
TRACE:通常不使用,非常詳細的信息。找到函數的一部分。

其他:
應用是多個項目project引用關聯是,注意jar版本一致;
如果是使用weblogic,它是自帶日誌的,要在weblogic.xml中聲明,才能使用到其他日誌系統;

參考鏈接:包括不限於以下…
[1]: http://ju.outofmemory.cn/entry/370706
[2]: https://www.cnblogs.com/xybaby/p/7954610.html?=330443877
[3]: https://www.cnblogs.com/huahua035/p/8022010.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章