日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你真的会正确使用日志吗?

發布時間:2025/3/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你真的会正确使用日志吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方?好好學java?,選擇?星標?公眾號

重磅資訊、干貨,第一時間送達

今日推薦:今天給大家推薦 6 個 Spring Boot 項目,拿來就可以賺錢!

個人原創100W+訪問量博客:點擊前往,查看更多

來源:frankiegao123

日志在應用程序中是非常非常重要的,好的日志信息能有助于我們在程序出現 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 標識設備的設備指紋或者設備 ID3. APP 用于指紋驗證的 token4. 密文數據指的是加密后的數據被掩碼的字符無論多少位都輸出 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.

日志配置

輸出

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

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

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

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

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

推薦文章
  • 今天給大家推薦 6 個 Spring Boot 項目,拿來就可以賺錢!

  • 交公糧了:我經常逛的技術網站

  • 圈子哥推薦一款基于 Spring Boot 開發 OA 開源產品,學習/搞外快都是不二選擇!

  • 硬剛一周,3W字總結,一年的經驗告訴你如何準備校招!

原創電子書歷時整整一年總結的?Java 面試 + Java 后端技術學習指南,這是本人這幾年及校招的總結,各種高頻面試題已經全部進行總結,按照章節復習即可,已經拿到了大廠offer。 原創思維導圖掃碼或者微信搜?程序員的技術圈子?回復?面試?領取原創電子書和思維導圖。

總結

以上是生活随笔為你收集整理的你真的会正确使用日志吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩日视频一区 | av青草| 杨幂一区二区国产精品 | 国产精品91久久久 | 国产xxxx孕妇 | 午夜激情视频在线观看 | 国产91沙发系列 | 欧美精品一区二区三区视频 | av免费高清 | 欧美超碰在线 | 青青草97国产精品麻豆 | 久久久黄色片 | 色婷婷综合五月 | 日日操夜夜操狠狠操 | 欧美日韩国 | 日韩精品中文字幕在线播放 | 9i免费看片黄| www污网站| 国产精品国产三级国产a | 日批在线观看 | 成人免费在线播放视频 | 国产av人人夜夜澡人人爽 | 中文字幕不卡在线观看 | 最近免费中文字幕 | 特级特黄刘亦菲aaa级 | a级一片 | 奶水旺盛的少妇在线播放 | 日韩av大全 | 一级淫片免费看 | 免费播放毛片精品视频 | 久久久久久久极品内射 | 在线不卡的av | 久久福利免费视频 | 封神榜二在线高清免费观看 | 又粗又大又硬又长又爽 | 中文字幕日韩久久 | 久久精品在线视频 | 精品自拍视频在线观看 | www.毛片.com| 国产大片一区二区三区 | 黑人黄色录像 | 欧美成年人在线观看 | 久久精品视频国产 | 日韩 欧美 自拍 | 玩偶姐姐在线看 | 欧美裸体女人 | 精品自拍av| av天堂一区二区三区 | 98av视频 | 亚洲色图19p| 制服丝袜在线一区 | 蜜桃成人无码区免费视频网站 | 欧美日韩激情 | 日本高清视频一区二区 | 粉嫩aⅴ一区二区三区四区五区 | 亚洲av中文无码乱人伦在线观看 | 午夜伦理影院 | 放荡的少妇2欧美版 | 偷自拍| 欧美性久久 | 久久一久久| 无码人中文字幕 | 先锋影音在线 | 妖精视频一区二区三区 | 日韩专区在线 | 国产成人啪精品午夜在线观看 | 国产精品一区二区三区免费视频 | 亚洲无码一区二区三区 | 国产男男gay体育生网站 | 午夜视频在线观看网站 | 国产黄色影院 | 韩日少妇| 久草国产精品视频 | 欧美丝袜脚交 | 国产成人精品免高潮费视频 | 黄色调教视频 | 日韩一区二区a片免费观看 伊人网综合在线 | 久久av中文字幕 | 久久羞羞 | 国产区免费 | 色综合天天综合网国产成人网 | 亚洲精品一级 | 可以看的av网站 | 天堂男人在线 | 中国特级黄色片 | 住在隔壁的她动漫免费观看全集下载 | 国产福利视频网站 | 亚洲精品视频中文字幕 | youjizz.com国产 | 美女aaa | 蜜臀视频网站 | 自拍偷拍激情视频 | www四虎影院 | 亚洲AV无码阿娇国产精品 | 啪啪综合网 | 加勒比综合在线 | 伊人久久大香线蕉av一区 | 亚洲精品乱码 | 国产综合婷婷 |