5条Java记录规则
日志記錄是一個關鍵因素,在軟件開發過程中應始終將其考慮在內。
當生產中發生不良情況時,日志文件通常是我們進行故障分析的起點。 而且,通常,它們是我們掌握的唯一信息,可以了解發生了什么以及問題的根本原因。
正確記錄所需的信息非常重要。
以下五個日志記錄規則是一種檢查方法,可能會改善我們處理代碼中日志記錄的方式。
請注意,我們不會討論如何配置日志記錄引擎,也不會將它們相互比較。
規則1.日志適用于讀者
日志消息對誰將讀取日志文件有意義,而不僅對誰編寫了(日志)代碼有意義。
這似乎是很明顯的規則,但經常被違反。
例如,讓我們考慮類似以下ERROR: Save failure - SQLException .....的日志消息ERROR: Save failure - SQLException .....
保存什么? 該消息可能對開發人員來說意味著什么,但對于正在考慮生產問題的可憐人來說卻完全沒有用。
更好的消息是ERROR: Save failure- Entity=Person, Data=[id=123 surname="Mario"] - SQLException....
其中說明了您要保存的內容(這里是一個Person,一個JPA實體)以及Person實例的相關內容。 請注意“ relevant ”一詞,而不是“ all all” :我們不應該使日志文件雜亂無章的信息,如所有實體字段的完整打印。 實體名稱及其邏輯鍵通常足以識別表中的記錄。
規則2.使日志記錄級別與執行環境匹配
Java生態系統中可用的所有日志記錄外觀和引擎都具有日志記錄級別(ERROR,INFO…)的概念,并且有可能過濾掉級別太低的消息。
例如, Java util日志記錄使用以下級別:SEVERE,WARN,INFO,FINE,FINER,FINEST(+ CONFIG和OFF)。
相反,兩個最受歡迎的日志記錄外觀Apache Commons Logging和SLFJ首選以下級別:FATAL,ERROR,WARN,INFO,DEBUG,TRACE。
日志記錄級別過濾應取決于代碼的開發階段:生產中的日志記錄級別不應與測試/集成環境中的日志記錄級別相同。
此外,日志記錄級別還應該取決于代碼所有者 。 通常,與我們使用的任何第三方庫相比,我們自己的應用程序代碼應具有更詳細的日志記錄。 例如,在我們的日志文件中查看Apache Commons調試消息沒有太大的意義。
我通常將日志記錄配置如下:
- 生產 :我的代碼為INFO級別,第三方庫為WARN。
- 測試/集成 :我的代碼的調試級別,以及第三方庫的警告(或信息,如果需要)。
- 發展 :任何有意義的
注意:我個人不鼓勵使用TRACE / FINEST級別(而且我并不孤單,例如,請參見此處 )。 我看不出DEBUG和TRACE之間有什么大的區別,對于年輕的團隊成員來說,通常很難決定要使用DEBUG還是TRACE。 遵循Kiss原則 ,我建議僅使用ERROR,WARN,INFO和DEBUG級別。
規則3.提交前刪除編碼幫助日志。
在編碼時,我們通常使用logger或System.out在我們的代碼中添加日志消息,以更好地了解執行/調試會話期間應用程序中正在發生的事情。
就像是:
void aMethod(String aParam) {LOGGER.debug(“Enter in aMethod”);if (“no”.equals(aParam)) {LOGGER.debug(“User says no”);….這些消息的主要目的是通過顯示調用哪個方法以及轉儲內部變量和方法參數值來跟蹤應用程序行為。 在非TDD愛好者中頗受歡迎。
不幸的是,一旦代碼發布(測試然后生產),這些消息通常沒有什么大的意義。
因此,該規則只是說:一旦完成開發,就在將代碼提交給使用的SCM系統(git,svn ..)之前,刪除所有臨時和不必要的日志記錄消息。
該規則不需要刪除所有DEBUG消息,而僅刪除那些在應用程序完成并釋放后沒有任何意義的消息。 換句話說,當我們合理確定應用程序正常運行時。
規則4:在記錄DEBUG消息之前檢查日志級別
根據規則2,在生產日志中,我們將僅顯示ERROR,WARN,INFO消息,但是在我們的代碼中,我們可以具有許多不影響生產執行的DEBUG消息。
每次您要記錄DEBUG消息(規則3之后的所有消息)時,請在前面添加檢查是否啟用了DEBUG記錄:
if ( LOGGER.isDebugEnabled() ) {LOGGER.debug (…….)}這將防止您編寫代碼來構建日志消息并調用記錄器。 這是為了提高生產中程序的執行效率。
規則5:了解您的記錄器
我們如何使用記錄器方法會產生巨大的成本:
- 構建消息字符串
- 收集要包含在消息字符串中的數據
我們應該查看所選日志外觀/引擎的Javadoc ,并了解使用其記錄器的最有效方法。
例如,我們可以創建如下消息:
LOGGER.info(“Person name is “ + person.getName());這會創建不必要的字符串實例。
使用SLF4J,正確的用法是:
LOGGER.info(“Person name is {}“, person.getName());其中格式字符串是常量,并且僅在啟用日志記錄后才生成最終消息。 有關更多詳細信息,請參見此處 。
翻譯自: https://www.javacodegeeks.com/2015/12/5-java-logging-rules.html
總結
以上是生活随笔為你收集整理的5条Java记录规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache camel_REST端点,
- 下一篇: 微服务和Java EE