java應用中的日志介紹

?

日志在應用程序中是非常非常重要的,好的日志信息能有助于我們在程序出現?BUG?時能快速進行定位,并能找出其中的原因。

?

但是,很多介紹?AOP?的地方都采用日志來作為介紹,實際上日志要采用切面的話是極其不科學的!對于日志來說,只是在方法開始、結束、異常時輸出一些什么,那是絕對不夠的,這樣的日志對于日志分析沒有任何意義。如果在方法的開始和結束整個日志,那方法中呢?如果方法中沒有日志的話,那就完全失去了日志的意義!如果應用出現問題要查找由什么原因造成的,也沒有什么作用。這樣的日志還不如不用!

?

希望藉以本文能讓應用程序的開發人員能更加重視日志,能在應用中輸出有意義的日志。

?

日志基本格式

?

日志輸出主要在文件中,應包括以下內容:

?

  • 時間

  • 日志級別主要使用

  • 調用鏈標識(可選)

  • 線程名稱

  • 日志記錄器名稱

  • 日志內容

  • 異常堆棧(不一定有)

?

11:44:44.827?WARN [93ef3E0120160803114444-1.2] [main] [ClassPathXmlApplicationContext] Exception encountered during context initialization - cancelling refresh attempt

?

日志時間

?

作為日志產生的日期和時間,這個數據非常重要,一般精確到毫秒。由于一般按天滾動日志文件,日期不需要放在這個時間中,使用 HH:mm:ss.SSS 格式即可。

?

日志級別

?

日志級別主要使用 DEBUG、INFO、WARN、ERROR。

?

DEBUG

DEUBG 級別的主要輸出調試性質的內容,該級別日志主要用于在開發、測試階段輸出。該級別的日志應盡可能地詳盡,便于在開發、測試階段出現問題或者異常時,對其進行分析。

?

INFO

INFO 級別的主要輸出提示性質的內容,該級別日志主要用于生產環境的日志輸出。該級別或更高級別的日志不要出現在循環中,可以在循環開始或者結束后輸出循環的次數,以及一些其他重要的數據。

?

  • 應用啟動時所加載的配置參數值(比如:連接參數、線程池參數、超時時間等,以及一些與環境相關的配置,或者是整個配置參數)

  • 一些重要的依賴注入對象的類名

  • 方法(服務方法)的輸入參數值、返回值,由于一些方法入參的值非常多,只在入口處輸出一次就可以了,在服務方法內部或者調用非服務方法時就不需要再輸出了

  • 方法中重要的部分,比如:從數據庫中所獲取較為重要的數據,以及調用第三方接口的輸入參數值和接口返回值

?

INFO 級別日志原則是在生產環境中,通過 INFO 和更高級別的日志,可以了解系統的運行狀況,以及出現問題或者異常時,能快速地對問題進行定位,還原當時調用的上下文數據,能重現問題。

?

建議在項目完成后,在測試環境將日志級別調成 INFO,然后通過 INFO 級別的信息看看是否能了解這個應用的運用情況,如果出現問題后是否這些日志能否提供有用的排查問題的信息。

?

WARN

WARN 級別的主要輸出警告性質的內容,這些內容是可以預知且是有規劃的,比如,某個方法入參為空或者該參數的值不滿足運行該方法的條件時。在 WARN 級別的時應輸出較為詳盡的信息,以便于事后對日志進行分析,不要直接寫成:

?

不好的日志

log.warn(?"name is null"?);

?

除了輸出警告的原因之外,還需要將其他參數內容都輸出,以便于有更多的信息供為日志分析的參考。

?

推薦的日志

log.warn(?"[{}] name is null, ignore the method, arg0: {}, arg1: {}"?, methodName , arg0 , arg1 );

?

ERROR

ERROR 級別主要針對于一些不可預知的信息,諸如:錯誤、異常等,比如,在 catch 塊中抓獲的網絡通信、數據庫連接等異常,若異常對系統的整個流程影響不大,可以使用 WARN 級別日志輸出。在輸出 ERROR 級別的日志時,盡量多地輸出方法入參數、方法執行過程中產生的對象等數據,在帶有錯誤、異常對象的數據時,需要將該對象一并輸出:

?

推薦的日志

log.error( "Invoking com.service.UserService cause error, username: {}" , username , e );

?

不要寫成(下面這種會將 e 作為日志內容參數中的一個,效果與使用 e.toString() 一致,不會輸出異常堆棧):

?

不好的日志

log.error(?"Invoking com.service.UserService cause error, username: {}, e: {}"?, username , e );

?

不要在日志中輸出下面這樣的日志,在異常堆棧 e 中本身就會輸出 e.getMessage 的內容,沒必要在日志行中輸出一遍,這樣的日志對于問題的追蹤毫無意義!

?

不好的日志

log.error( e.getMessage() , e );

?

調用鏈標識

?

在分布式應用中,用戶的一個請求會調用若干個服務完成,這些服務可能還是嵌套調用的,因此完成一個請求的日志并不在一個應用的日志文件,而是分散在不同服務器上不同應用節點的日志文件中。該標識是為了串聯一個請求在整個系統中的調用日志。

?

調用鏈標識格式:

?

  • 唯一字符串(trace ID)

  • 調用層級(span ID)

?

調用鏈標識作為可選項,無該數據時只輸出?[]?即可。

?

線程名稱

?

輸出該日志的線程名稱,一般在一個應用中一個同步請求由同一線程完成,輸出線程名稱可以在各個請求產生的日志中進行分類,便于分清當前請求上下文的日志。

?

日志記錄器名稱

?

日志記錄器名稱一般使用類名,日志文件中可以輸出簡單的類名即可,看實際情況是否需要使用包名。主要用于看到日志后到哪個類中去找這個日志輸出,便于定位問題所在。

?

日志內容

?

注意事項

?

禁用 System.out.println

src/main 的代碼中嚴禁使用 System.out.println 進行輸出,因為生產環境一般不會將標準輸出和錯誤輸出重定向到文件中去,如果代碼中使用該方式輸出日志,可能會導致該輸出丟失。

?

變參替換日志拼接

使用 slf4j 的 Logger 進行處理,使用其變參功能進行日志輸出,不要在日志中進行字符串的拼接,比如:

?

推薦的日志

log.debug( "Load No.{} object, {}" , i , object );

?

不要寫成?log.debug ( "Load No." + i + " object, " + object );?這是因為將日志級別調至 INFO 或以上級別時,這樣會增加無畏的字符串拼接。

?

實現 toString()

需要輸出日志的對象,應在其類中實現快速的 toString 方法,以便于在日志輸出時僅輸出這個對象類名和 hashCode。該 toString 方法應該處理類中所有的字段。toString 方法可以通過 IDE 的自動功能 toString 功能生成。toString 方法建議不要通過反射或者一些 toString 工具類生成,也不要直接使用 JSON 序列化工具轉為 JSON 字符串,這兩者均使用反射進行處理的,僅為了輸出日志較為影響應用的性能。

?

預防空指針

不要在日志中調用對象的方法獲取值,除非確保該對象肯定不為 null,否則很有可能會因為日志的問題而導致應用產生空指針異常。

?

不好的日志

log.debug( "Load student(id={}), name: {}" , id , student.getName() );

?

可以改為(當 student 為 null 時,這樣也不會產生空指針異常):

?

推薦的日志

log.debug( "Load student(id={}), student: {}" , id , student );

?

對于一些一定需要進行拼接字符串,或者需要耗費時間、浪費內存才能產生的日志內容作為日志輸出時,應使用 log.isXxxxxEnable() 進行判斷后再進行拼接處理,比如:

?

推薦的代碼

if ( log.isDebugEnable() ) {
????StringBuilder builder = new StringBuilder();
????for ( Student student : students ) {
????????builder.append( "student: " ).append( student );
????}
????builder.append( "value: " ).append( JSON.toJSONString(object) );
????log.debug( "debug log example, detail: {}" , builder );
}

?

信息安全

?

切記不要 log 密碼及個人信息相關的內容!為了便于進行問題定位,以下是涉及敏感信息日志輸出時最為寬松(明文顯示的數據只能更少,不能更多)的要求:

?

類型
要求
示例
說明
密碼不輸出******登錄密碼、支付密碼等各種類型的密碼
信用卡 CVV2不輸出***?
信用卡有效期不輸出****?
驗證碼不輸出******圖形驗證碼、短信驗證碼、郵件驗證碼等
密鑰、鹽不輸出******用于加解密算法的密鑰,消息摘要的鹽,以及數字簽名及簽名驗證算法所使用的公私鑰對等

會話 ID

設備指紋 (ID)

指紋 token

密文數據

前 5 后 57SuA8***TtslB

主要有以下類型:

1. 應用的會話標識,比如:Web、APP、H5 等用于識別會話狀態信息的標識

2. APP 標識設備的設備指紋或者設備 ID

3. APP 用于指紋驗證的 token

4. 密文數據指的是加密后的數據

被掩碼的字符無論多少位都輸出 3 個 *

銀行卡卡號前 6 后 4622666******0831銀行卡卡號最多 19 位數字
手機號前 3 后 4137****9574定長 11 位數字
身份證號前 1 后 13******X定長 18 位
姓名隱姓*世仁將姓氏隱藏
IP 地址前 1 后 110.*.*.27隱藏 IP 地址的第 2、第 3 段
郵箱地址前 1 后 1w**3@gmail.com僅對 @ 之前的郵箱名稱進行掩碼,掩碼部分不管多少位均輸出 ***
地址隱號碼上海市西藏北路 *** 號 *** 樓 *** 室?

上述僅列取出部分數據的顯示要求,其他的顯示原則為通過掩碼后的數據無法得知原始數據。

?

實現了如上掩碼的工具類,參考:https://github.com/frankiegao123/mask-utils

?

異常堆棧

?

異常堆棧一般會出現在 ERROR 或者 WARN 級別的日志中,異常堆棧含有方法調用鏈的系統,以及異常產生的根源。異常堆棧的日志屬于上一行日志的,在日志收集時需要將其劃至上一行中。

?

日志文件

?

日志文件放置于固定的目錄中,按照一定的模板進行命名,推薦的日志文件名稱:

?

  • 當前正在寫入的日志文件名:<應用名>[-<功能名>].log

  • 已經滾入歷史的日志文件名:<應用名>[-<功能名>].log.<yyyy-MM-dd>

    ?

?

日志配置

?

輸出

?

根據不同的環境配置不同的日志輸出方式:

?

  • 本地調試可以將日志輸出到控制臺上

  • 測試環境或者生產環境輸出到文件中,每天產生一個文件,如果日志量龐大可以每個小時產生一個日志文件

  • 生產環境中的文件輸出,可以考慮使用異步文件輸出,該種方式日志并不會馬上刷新到文件中去,會產生日志延時,在停止應用時可能會導致一些還在內存中的日志未能及時刷新到文件中去而產生丟失,如果對于應用的要求并不是非常高的話,可暫不考慮異步日志

?

logback 日志工具可以在日志文件滾動后將前一文件進行壓縮,以減少磁盤空間占用,若使用 logback 對于日志量龐大的應用建議開啟該功能。

轉載于:https://www.cnblogs.com/cat520/p/9810701.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537677.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟全新Chromium版Edge瀏覽器下載

下載地址&#xff1a; https://www.microsoft.com/en-us/edge

企業網站 源碼 服務郵箱:_后來才知道:溫州騰訊企業郵箱定制服務

后來才知道&#xff1a;溫州騰訊企業郵箱定制服務 qnmsptdb后來才知道&#xff1a;溫州騰訊企業郵箱定制服務 軟文推廣得到大家的轉發之后&#xff0c;那么軟文的經濟價值也會隨之而來。內容更新質量言外之意&#xff0c;如果你長期更新低質量內容&#xff0c;是不可取的&#…

圣三一學院計算機專業,360教育集團:愛爾蘭都柏林大學圣三一學院計算機專業...

應用&#xff0c;新產品設計。網絡和分布系統的安全和管理課程介紹計算機基層和網絡安全&#xff0c;研究網絡管理的方法和高端信息服務的管理。這六個部分內容的學習包括每周大概20小時的溝通時間&#xff0c;包括講座、輔導、研討會、試驗等。絕大部分課程要求學生完成其他課…

JavaScript的檢測及其數據類型

一、JavaScript有幾種類型的值&#xff1f;Javascript有兩種數據類型&#xff0c;分別是基本數據類型和引用數據類型。其中基本數據類型包括Undefined、Null、Boolean、Number、String、Symbol (ES6新增&#xff0c;表示獨一無二的值)&#xff0c;而引用數據類型統稱為Object對…

我是Leader,我被降職成了普通員工,HR說:公司要梯隊年輕化

“BAT也不是完美的避風港哇~”這是老劉說的&#xff0c;老劉是BAT某家的一個Leader&#xff0c;職級約類似T7(T族一般是技術族&#xff0c;管理是M族)&#xff0c;在BAT某家呆了11年&#xff0c;但是在整個互聯網行業推崇&#xff0c;梯隊年輕化的氛圍時&#xff0c;老劉所在的…

in最多可以放多少?_汽車最多可以停放多少天不開?維修師傅:盡可能別超過這個時間...

在當下&#xff0c;買車似乎已經成為了一種消費潮流&#xff0c;其中不乏一些本身用車需求不明顯但也隨大流買車的人&#xff0c;結果車買回來之后最初的新鮮勁一過就放在那里不怎么用了。當然也有部分車主是因為自己的工作修需要經常需要在外出差&#xff0c;那么就算想天天開…

計算機電源風扇安裝方法,機箱風扇怎么裝 電腦機箱風扇電源線接法

夏天天氣炎熱&#xff0c;電腦機箱內溫度也較高&#xff0c;溫度過高會影響電腦性能出現死機等問題&#xff0c;甚至影響硬件壽命。所以給機箱裝風扇來散熱是非常重要的。那么&#xff0c;機箱風扇怎么裝合理呢?機箱風扇的電源線怎么接呢?下面分享一下機箱風...夏天天氣炎熱&…

使用微服務失敗的12個原因

在過去的幾年中&#xff0c;我已經對處于數字化轉型過程中的多個產品團隊進行了架構審查。大多數團隊都在按照微服務架構構建產品。他們有使用基于微服務的體系結構的所有正確意圖-更快的開發&#xff0c;更好的可伸縮性&#xff0c;更小的獨立團隊&#xff0c;獨立的部署&…

市場壓力只有老板扛?柏明頓阿米巴如何傳遞經營壓力

內部交易是阿米巴經營模式中的一個重要環節&#xff0c;通過內部交易&#xff0c;使企業內部上下道工序之間以價格為紐帶&#xff0c;以服務和產品進行等價交換&#xff0c;統一結算交易。通過內部交易行為&#xff0c;可以掌握各個阿米巴單元的盈虧狀態。阿米巴構建內部市場&a…

flutter怎么添加ios網絡權限_視頻號直播間怎么添加購物車商品;超詳細流程步驟。丨國仁網絡資訊...

蘑菇租房的聯合創始人龍東平前幾個月曾說&#xff1a;“視頻號是一次掀翻桌子重新排座次的機會&#xff0c;是巨浪滔天&#xff0c;是新世界&#xff0c;新秩序。”視頻號發展趨勢愈加迅猛&#xff0c;越來越多的玩家涌入&#xff0c;正在獲得新一波社交流量。為什么更加受歡迎…

網絡中服務器是指為網絡提供資源,并對這些資源進行管理的計算機,2016年職稱計算機考試Internet沖刺試題及答案3...

1、Internet的通信協議是( A )A、TCP/IP B、OSI/ISOC、NetBEUI D、NWLink2、把計算機網絡分為有線和無線網的主要分類依據是(C)A、網絡成本 B、網絡的物理位置C、網絡的傳輸介質 D、網絡的拓撲結構3、要將兩臺計算機直接相連&#xff0c;那么使用雙絞線的類型為(A)A、交叉線 B、…

Visio 圖形大小如何隨文字多少自動調整?

Visio 圖形大小默認是根據圖形內文字多少自動調整。 如果手動調整過圖形&#xff0c;那么該圖形就不再隨文字多少自動調整了。 解決辦法&#xff1a; 刪除該圖形&#xff0c;重新拉取一個&#xff0c;重新編寫文本

java同一個包中,類之間的的調用

如果是靜態方法&#xff0c;直接 類名.方法名即可&#xff0c;如果是非靜態方法&#xff0c;則需new一個對象出來&#xff0c;然后用對象.方法名調用如&#xff1a;public class A{public static void T(){System.out.print("這是A類的方法");}public void T2(){Syst…

mos管開關電路_【電路】MOS管開關電路圖詳解(一)

MOS管的開關特性靜態特性MOS管作為開關元件&#xff0c;同樣是工作在截止或導通兩種狀態。由于MOS管是電壓控制元件&#xff0c;所以主要由柵源電壓uGS決定其工作狀態。工作特性如下&#xff1a;※uGS※ uGS>開啟電壓UT:MOS管工作在導通區&#xff0c;漏源電流iDSUDD/(RDrDS…

Visio圖形自動編號

操作步驟&#xff1a; 1.進入“視圖”--“加載項” 2.“加載項”---“運行加載項” 3.“運行加載項”---“給形狀編號”

偽代碼就是計算機語言 正確嗎,偽代碼實例紹.ppt

偽代碼實例紹第2章 偽代碼實例介紹 主講&#xff1a;黃明瓊 第2章 偽代碼實例介紹 2.1 偽代碼介紹 2.2 三角形問題 2.3 NextDate函數問題 2.4 傭金問題 2.5 簡單ATM系統 2.6 貨幣轉換器 本章教學目標 正確理解偽代碼的概念 正確理解偽代碼的規則 正確理解偽代碼實例中的邏輯 能…

Java面試170題答案解析(1-20題)

為什么80%的碼農都做不了架構師&#xff1f;>>> 轉載于:https://my.oschina.net/lanyu96/blog/2250020

query builder python-elasticsearch返回指定字段

1. postman 請求elasticsearch 返回指定字段 1.直接在請求體當中&#xff0c;json 數據&#xff0c;對應的是一個列表 { "_source":["title","id","desc"], "from":10, "size":100, } 至于from和size是淺分頁 2. …

Visio各圖形如何一鍵自動對齊?

在創作的過程中&#xff0c;不用管圖形是否對齊&#xff0c;間距是否一致&#xff0c;在最后的時候&#xff0c;一鍵對齊 具體操作&#xff1a; 開始---------位置------自動對齊與自動調整間距

黎明之路服務器正在維護,黎明之路進不去怎么辦_黎明之路更新失敗怎么辦_玩游戲網...

《代號Z》什么時候上線根據最新的消息&#xff0c;《代號Z》這款游戲已經正式更名為《黎明之路》&#xff0c;那么名字也最終確定了&#xff0c;這款游戲到底什么時候上線呢&#xff1f;下面就跟著玩游戲網的小編一起了解一下吧~《代號Z》上線時間&#xff1a;游戲將會在4月26日…