精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

日志到底應該怎么打?。?/h1> 原創

開發 前端
寫代碼的人就沒有不寫日志的,但我們到底該怎么打印日志,打印日志能不能有點章法?

[[385165]]

【51CTO.com原創稿件】前言

寫代碼的人就沒有不寫日志的,但我們到底該怎么打印日志,打印日志能不能有點章法?

針對這個問題,我查閱了《阿里巴巴Java開發手冊》,里面有 8 條日志規約。比如不同作用的日志存放到不同的日志文件里,以 appName_logType_logName.log 方式進行命名。是挺不錯,但屬于是日志分類的問題,依舊解決不了程序員如何有章法的在代碼中書寫日志的問題。

探尋

先來看一個比較常見的日志打印示例:

  1. log.info("開始執行業務邏輯 ----------------->{}",param); 
  2. log.info("業務邏輯執行中 ----------------->{}",param); 
  3. log.info("結束執行業務邏輯 ----------------->{}",param); 
  4. log.error("業務執行異常 ----------------->{}",param, e); 

這種日志打印有什么問題?

第一、沒有綁定事件

在執行什么業務邏輯呢?沒有一個明確的事件,或者說是名字、歸類,我更愿稱之為事件。我們搜索日志時,是要有一個主語的,如果在日志打印中加入事件,我們搜索日志時,只需要輸入關鍵字即可獲取該事件的所有日志。改進后的⽇志打?。?/p>

  1. log.info("{}|開始執行業務邏輯 ----------------->{}",EVENT_NAME, param); 
  2. log.info("{}|業務邏輯執行中 ----------------->{}",EVENT_NAME, param); 
  3. log.info("{}|結束執行業務邏輯 ----------------->{}",EVENT_NAME, param); 
  4. log.error("{}|業務執行異常 ----------------->{}",EVENT_NAME, param, e); 

第二、沒有綁定主鍵

一個事件下的日志無時無刻不在產生,而發生問題時,往往只會給你一個 case 進行診斷,所以,我們除了記錄事件,還需要記錄主鍵,通過觀察這個主鍵在執行過程中都產生了哪些日志來定位問題。改進后的日志打?。?/p>

  1. log.info("{}|ID={}|開始執行業務邏輯 ----------------->{}",EVENT_NAME, ID, param); 
  2. log.info("{}|ID={}|業務邏輯執行中 ----------------->{}",EVENT_NAME, ID, param); 
  3. log.info("{}|ID={}|結束執行業務邏輯 ----------------->{}",EVENT_NAME, ID, param); 
  4. log.error("{}|ID={}|業務執行異常 ----------------->{}",EVENT_NAME, ID, param, e); 

第三、沒有綁定請求

有了事件,有了主鍵,但是在查詢日志的過程中,發現該主鍵產生了許多重復日志,日志的上下文不連貫,我們想看某一次請求產生的連續日志就非常不方便,這時候就需要考慮并發的情況。改進后的日志打?。?/p>

  1. // 可以使用 UUID 生成ReqId 
  2. // final String ReqId = UUID.randomUUID().toString(); 
  3. log.info("{}|ReqId={}|ID={}|開始執行業務邏輯 ----------------->{}",EVENT_NAME, ReqId, ID, param); 
  4. log.info("{}|ReqId={}|ID={}|業務邏輯執行中 ----------------->{}",EVENT_NAME, ReqId, ID, param); 
  5. log.info("{}|ReqId={}|ID={}|結束執行業務邏輯 ----------------->{}",EVENT_NAME, ReqId, ID, param); 
  6. log.error("{}|ReqId={}|ID={}|業務執行異常 ----------------->{}",EVENT_NAME, ReqId, ID, param, e); 

第四、沒有綁定分詞符

不要在日志打印時使用 --- 這種分隔符,沒意義、不標準,非常不好做分詞。一定要將不變的文字說明和變化的參數用分詞符分開打印,因為不變的文字說明也是可以成為關鍵詞進行搜索的。改進后的日志打?。?/p>

  1. log.info("{}|ReqId={}|ID={}|開始執行業務邏輯|參數={}",EVENT_NAME, ReqId, ID, param); 
  2. log.info("{}|ReqId={}|ID={}|業務邏輯執行中|參數={}",EVENT_NAME, ReqId, ID, param); 
  3. log.info("{}|ReqId={}|ID={}|結束執行業務邏輯|參數={}",EVENT_NAME, ReqId, ID, param); 
  4. log.error("{}|ReqId={}|ID={}|業務執行異常|參數={}",EVENT_NAME, ReqId, ID, param, e); 

第五、錯誤日志需要輸出異常信息

對于異常日志的打印一定要帶上堆棧信息,異常堆棧不能使用 e.printStackTrace() 輸出到控制臺,這樣異常堆棧是寫入不了日志文件的,需要將異常對象寫進最后的參數里,這點相信大家都懂。

除此之外,還需要將異常信息的 toString() 內容打印進同一行日志里。因為異常堆棧都是另起一行,對于一些單行日志記錄的系統,比如阿里云sls,根本看不到異常信息,還得爬進服務器找日志堆棧。所以,還是很有必要將 e.toString() 寫進參數里的,有些異常只看 e.toString() 的內容就可以定位了。為什么我這里要求使用 e.toString() 而不是 e.getMessage() ?因為如果是NullPointerException異常, e.getMessage() 返回空。改進后的代碼:

  1. log.error("{}|ReqId={}|ID={}|業務執行異常|參數={}|e={}",EVENT_NAME, ReqId, ID, param, e.toString(), e); 

第六、若有循環,需要綁定循環主鍵

將上面例子加個業務上的循環,再來看下代碼:

  1. log.info("{}|ReqId={}|ID={}|開始執行業務邏輯|參數={}",EVENT_NAME, ReqId, ID, param); 
  2. for (Key key : KeyList) { 
  3. log.info("{}|ReqId={}|ID={}|業務邏輯執行中|參數={}",EVENT_NAME, ReqId, ID, param); 
  4. log.info("{}|ReqId={}|ID={}|結束執行業務邏輯|參數={}",EVENT_NAME, ReqId, ID, param); 

這樣產生的日志,非常不方便定位到具體的某次循環。如果循環體內出了異常,也不清楚具體是哪個Key 引發的。所以,遇到業務邏輯位于循環內的代碼,應該打印出每次處理的 Key。改進后的代碼:

  1. log.info("{}|ReqId={}|ID={}|開始執行業務邏輯|參數={}",EVENT_NAME, ReqId, ID, param); 
  2. for (Key key : KeyList) { 
  3. log.info("{}|ReqId={}|ID={}|Key={}|業務邏輯執行中|參數={}",EVENT_NAME, ReqId, ID, key, param); 
  4. log.info("{}|ReqId={}|ID={}|結束執行業務邏輯|參數={}",EVENT_NAME, ReqId, ID, param); 

公式

經過上面的分析之后,我們可以總結出日志打印的公式:

  1. EVENT_NAME={}|ReqId={}|Key={}|childKey={}|doing something|result={} 

如果沒有過程的話,ReqId 是可以省略的,Key 的數量也不一定只是一個,你也可以看情況給日志加一列 [start|end] ,表示業務過程的開始和結束。

JSON日志

之前有段時間寫過 JSON 格式的日志,就是每一個行日志都是一個 JSON 串,上面講到的日志可以稱為單行日志。

舉個例子:

  1. Map<String, Object> logMap = new HashMap<>(); 
  2. try{ 
  3. logMap.put("EVENT_NAME""monitor"); 
  4. // .... 
  5. }finally { 
  6. LogUtil.save(JSON.toJSONString(logMap)); 

輸出日志(為了方便查看,我已格式化):

  1. "EVENT_NAME""monitor"
  2. "ReqId""654321"
  3. "ID""123456"
  4. "success"true
  5. "param": { 
  6. "name""zs"
  7. "age": 14 
  8.  } 

JSON 日志天然綁定了請求過程,它最大的優勢是輸出序列化好的 JSON 串,非常方便離線對其各種操作。但對比于單行日志,代碼嵌入性太高,需要通過 try..finally 代碼塊進行捕捉。

主⻚:https://github.com/onblog

PS:以前我喜歡用 JSON 日志,現在我更喜歡用單行日志

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

責任編輯:華軒 來源: 51CTO
相關推薦

2021-01-15 19:10:32

日志打印原則

2016-06-01 11:27:24

2020-09-15 12:59:48

KotlinFlutter移動

2021-05-10 06:58:41

ChromeFlash版本號

2021-01-21 05:51:52

Chrome FlashWindows

2015-09-08 09:20:49

案例研究混合云云部署

2020-06-23 14:28:24

MySQL商品數據

2020-05-11 23:18:09

內存條CPU插槽

2023-11-24 08:17:38

金額類型存儲

2011-08-29 09:45:09

2014-01-07 13:54:40

Hadoop日志

2019-03-18 10:32:33

容災雙活同城

2022-12-29 07:24:55

打印日志Python

2015-11-05 09:26:34

Fedora發行版Linux

2023-03-24 12:52:22

2024-06-27 08:04:39

2020-04-30 14:38:51

數據庫連接池線程

2021-08-30 11:43:46

程序員技能開發者

2020-06-17 10:35:16

機器學習AI人工智能

2010-01-07 10:09:38

千兆網絡交換機
點贊
收藏

51CTO技術棧公眾號

精品第一国产综合精品aⅴ| 中文字幕精品一区二区精品绿巨人 | 在线观看视频亚洲| 91视频福利网| 亚洲国产欧美日本视频| 亚洲视频狠狠干| 精品视频一区二区| 亚洲精品国产精品乱码视色| 欧美福利电影在线观看| 亚洲欧美制服中文字幕| 中文字幕1234区| 夜鲁夜鲁夜鲁视频在线播放| 亚洲欧美日韩在线播放| 欧美日韩精品久久久免费观看| 一区不卡在线观看| 免费亚洲视频| 欧美人在线视频| 黄大色黄女片18免费| 成人激情自拍| 欧美一区二区三级| 国内自拍视频一区| 手机av在线| 亚洲综合一区二区| 中文字幕剧情在线观看一区| 黄视频在线播放| 成人一区二区三区视频在线观看| 国产精品旅馆在线| 久久久蜜桃一区二区| 亚洲经典视频在线观看| 美女撒尿一区二区三区| 美女网站视频色| 免费观看久久av| 亚洲精品91美女久久久久久久| 在线观看日本www| 国产乱子精品一区二区在线观看| 婷婷亚洲久悠悠色悠在线播放| 国产精品无码乱伦| 最新电影电视剧在线观看免费观看| av日韩在线网站| 国产精品成人一区二区三区| 国产成人av免费看| 激情综合一区二区三区| 国产乱肥老妇国产一区二| 黄色一级视频免费看| 久久精品系列| 人人爽久久涩噜噜噜网站| 国产成人在线播放视频| 91久久久久| 国内成人精品一区| 日本在线视频免费观看| 亚洲精品美女91| 97久久伊人激情网| 精品欧美一区二区三区免费观看 | 色综合导航网站| 久久午夜无码鲁丝片| 午夜视频一区| 久久久久久久一区二区三区| 国产稀缺真实呦乱在线| 在线欧美亚洲| 欧美亚洲成人免费| 日本熟女毛茸茸| 日本伊人午夜精品| 国产欧美一区二区三区久久人妖 | 粉嫩一区二区三区性色av| 俄罗斯精品一区二区| 天天干天天爽天天操| 91香蕉视频污| 亚洲国产综合自拍| 黄色网址在线免费播放| 一区二区三区产品免费精品久久75| 国产成人一二三区| 欧美aa在线| 欧美在线一区二区| 在线观看你懂的视频| 红杏成人性视频免费看| 亚洲欧美中文另类| 手机av在线看| 制服诱惑一区二区| 国产精品视频自在线| 精品国产亚洲AV| 91丨九色丨国产丨porny| 先锋在线资源一区二区三区| 91麻豆免费在线视频| 婷婷开心激情综合| 一个色综合久久| 久久精品凹凸全集| 在线视频欧美日韩精品| 欧美丰满艳妇bbwbbw| 国产欧美日韩一区二区三区在线| 国产精品成av人在线视午夜片 | 国产福利一区二区| 欧美激情国产日韩| 国产黄a三级三级三级av在线看| 亚洲国产成人va在线观看天堂| 成人羞羞国产免费网站| 国产成年精品| 亚洲欧美国产精品专区久久| 麻豆明星ai换脸视频| 亚洲综合社区| 不卡视频一区二区三区| 成人在线二区| 亚洲a一区二区| 涩涩网站在线看| 美女亚洲一区| 久久久久久久久久婷婷| 一级片视频播放| 91蜜桃网址入口| 欧美国产视频一区| 久久爱.com| 亚洲精品日韩久久久| 久久亚洲av午夜福利精品一区| 免费xxxx性欧美18vr| 久久精品二区| 暧暧视频在线免费观看| 337p亚洲精品色噜噜噜| 97人妻人人揉人人躁人人| 亚洲网站啪啪| 5566av亚洲| 国产激情在线观看| 精品视频色一区| www在线观看免费视频| 激情亚洲成人| 91在线播放视频| 欧美性videos| 欧美色区777第一页| 欧美多人猛交狂配| 一本久道久久综合狠狠爱| 成人xxxxx色| 亚洲色图美国十次| 欧美一区二区三区思思人| 手机av在线不卡| 日韩成人一区二区| 欧美精品国产精品久久久| 97天天综合网| 精品成人在线观看| 久久综合加勒比| 福利一区二区在线| 久久综合久久网| 成人福利免费在线观看| 久久久久久久久久av| 成 人 免费 黄 色| 一区二区三区91| 中文字幕一区二区三区人妻在线视频| 1024精品久久久久久久久| 成人高h视频在线| 超碰超碰在线| 欧美大片顶级少妇| 日本少妇性高潮| 91在线视频18| 国产av无码专区亚洲精品| 制服丝袜日韩| 国产精品久久久久久久7电影| www.久久热.com| 69堂精品视频| 精品爆乳一区二区三区无码av| 国产激情偷乱视频一区二区三区| 成人一区二区av| 女人抽搐喷水高潮国产精品| 51久久精品夜色国产麻豆| 青青草观看免费视频在线| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 久草网视频在线观看| 成人国产精品免费网站| 中文字幕无码精品亚洲35| 一区二区三区日本久久久 | 欧美国产激情二区三区| 国产永久免费网站| 国产精品国码视频| 久久精品女人的天堂av| 怡红院成人在线| 久久久www成人免费精品张筱雨| 国产草草影院ccyycom| 午夜欧美大尺度福利影院在线看| 无码人妻aⅴ一区二区三区69岛| 免费美女久久99| 中文精品无码中文字幕无码专区| 天堂在线精品| 成人国内精品久久久久一区| 大桥未久在线视频| 中文字幕日韩欧美精品在线观看| 国产suv一区二区| 欧美午夜www高清视频| ass极品国模人体欣赏| 国产成人在线视频网址| 欧美v在线观看| 外国成人免费视频| 九九九九精品九九九九| 久久人体av| 国内自拍欧美激情| 最新电影电视剧在线观看免费观看| 欧美变态口味重另类| 无码人妻黑人中文字幕| 一区二区三区四区av| 日本少妇xxxxx| 成人精品鲁一区一区二区| 国产嫩草在线观看| 日韩一级精品| 免费cad大片在线观看| 精品成人影院| 国内一区在线| 激情不卡一区二区三区视频在线| 青青久久av北条麻妃黑人| 国产福利视频在线| 在线视频欧美日韩| 日韩电影在线观看完整版| 欧美一区在线视频| 人人妻人人爽人人澡人人精品| 一二三区精品视频| 永久免费未视频| 久久久久久久久久看片| www.啪啪.com| 国产精品456露脸| 中文字幕 欧美日韩| 久久久久欧美精品| 国产午夜大地久久| 亚洲天堂偷拍| 国产在线观看欧美| 一区二区三区在线观看免费| 亚洲成色最大综合在线| 久久综合影院| 久久久水蜜桃| 欧美韩一区二区| 俄罗斯精品一区二区三区| 精品国产不卡一区二区| 国产日韩在线视频| 国产成人毛片| 国产精品一区二区三| 欧美三级网址| 日本精品视频网站| 日韩伦理精品| 91精品国产91| 男人久久天堂| 欧美亚洲成人xxx| 男人天堂视频在线观看| 97超级碰碰碰| 麻豆视频在线观看免费网站黄| 欧美激情欧美狂野欧美精品| 在线电影福利片| 欧美成人在线网站| 欧美bbbxxxxx| 久久久免费观看| 春色校园综合激情亚洲| 91高清免费视频| 国产伦精品一区二区三区视频金莲| 2019中文字幕在线| 精品三级久久| 日本国产欧美一区二区三区| 欧美成人精品一区二区男人小说| 国产z一区二区三区| 国精产品一区二区三区有限公司| 国产成人久久久精品一区| 亚洲综合在线电影| 国产精品免费视频xxxx| 色综合久久久| 91文字幕巨乱亚洲香蕉| 精品欧美午夜寂寞影院| 久久精品女人的天堂av| 欧美久久综合网| 在线视频不卡国产| 欧美三级乱码| 激情综合在线观看| 日本va欧美va精品发布| 午夜av中文字幕| 高清免费成人av| 免费黄色在线视频| 国产精品亲子乱子伦xxxx裸| 欧美色图亚洲视频| 午夜精品福利一区二区蜜股av| 欧美一区二区三区四| 91国偷自产一区二区开放时间| 91精品国产色综合久久不8| 日韩欧美国产综合在线一区二区三区| 欧美一级在线免费观看| 亚洲丝袜av一区| 中文字幕有码在线观看| 6080yy精品一区二区三区| 成人黄色视屏网站| av资源一区二区| 精品久久久久久久| 日韩视频一二三| 麻豆成人精品| 欧美在线a视频| aaa国产一区| 中日韩一级黄色片| 精品免费在线视频| 亚洲在线观看av| 亚洲精品久久久久久久久| 免费在线视频欧美| 欧美一级bbbbb性bbbb喷潮片| 91国产一区| 农村寡妇一区二区三区| 自拍偷拍欧美| 欧美一级裸体视频| 国产精品亚洲一区二区三区在线 | 91一区二区| 九色在线视频观看| 国产一区二区精品久久99| 国产成人av一区二区三区不卡| 一区二区三区在线观看国产| 日韩国产成人在线| 亚洲精品动漫久久久久| 成人福利网站| 国产精品美乳在线观看| 精品午夜电影| 成人在线免费高清视频| 久久69国产一区二区蜜臀| 天天躁日日躁aaaxxⅹ| 伊人夜夜躁av伊人久久| 一级黄色片视频| 国产亚洲欧美视频| 黄视频网站在线观看| www.成人三级视频| 久久久久久美女精品 | 成人在线免费| 久热国产精品视频一区二区三区| 欧美啪啪一区| 伊人免费视频二| 国产精品传媒入口麻豆| 欧美激情一区二区三区免费观看 | 日本美女一区二区| 精品人妻少妇嫩草av无码| 亚洲无人区一区| 超碰人人人人人人| 不卡伊人av在线播放| 亚洲精品一区av| 亚洲一区二区三区精品视频 | 国产精品久久久久久久久久99| 亚洲a级精品| 日韩国产欧美亚洲| 99re成人在线| 国产成人在线观看网站| 亚洲第一区中文字幕| f2c人成在线观看免费视频| 懂色av一区二区三区在线播放| 欧美午夜不卡| 看全色黄大色黄女片18| 午夜精品爽啪视频| 天堂中文资源在线观看| 91精品国产91久久久久久久久| 国产精品美女在线观看直播| 久久久久99精品成人片| www.成人在线| 五月天激情国产综合婷婷婷| 亚洲欧美另类国产| 欧洲成人一区| 亚洲午夜高清视频| 国产在线精品一区二区| 欧美日韩一级在线观看| 精品久久久久久久一区二区蜜臀| 草美女在线观看| 精品一区久久| 免费观看在线色综合| 亚洲欧美精品久久| 欧美一三区三区四区免费在线看| 色呦呦网站在线观看| 精品国产区在线| 日韩激情视频在线观看| 欧美性生交大片| 欧美精品一区二区三| 美女在线视频免费| 五月天久久综合网| 国产在线视频一区二区| 日韩精品乱码久久久久久| 亚洲人成自拍网站| 日韩毛片免费看| 欧美一区二区激情| 国产日韩欧美综合在线| 亚洲一卡二卡在线观看| 欧美大片第1页| 欧美禁忌电影网| 欧美激情第一区| 激情亚洲一区二区三区四区 | wwwwwxxxx日本| 一区二区三区中文在线| 嫩草研究院在线| 成人午夜两性视频| 国产欧美日韩一级| 小早川怜子一区二区的演员表| 精品日产卡一卡二卡麻豆| 成人欧美magnet| 中文字幕免费高| 久久久一区二区三区捆绑**| 国产又大又粗又长| 国产91ⅴ在线精品免费观看| 久久亚洲影视| 午夜不卡久久精品无码免费| 欧美在线999| av影片在线| 中文字幕乱码一区二区三区| 成人国产精品免费观看| 亚洲综合五月天婷婷丁香| 国语自产精品视频在线看| 日韩理论片av| 三叶草欧洲码在线| 91精品国产综合久久久久久 | 91ts人妖另类精品系列| 欧美精品一区男女天堂| 91成人在线| 播放灌醉水嫩大学生国内精品| 亚洲欧美日韩在线不卡|