成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

求你了,別亂打印日志了!

運維 數(shù)據(jù)庫運維
日志是快速定位問題的好幫手,是撕逼和甩鍋的利器!打印好日志非常重要。今天我們來聊聊日志打印的 15 個好建議。

 [[426732]]

圖片來自 包圖網(wǎng)

選擇恰當?shù)娜罩炯墑e

常見的日志級別有 5 種,分別是 error、warn、info、debug、trace:

  • error:錯誤日志,指比較嚴重的錯誤,對正常業(yè)務(wù)有影響,需要運維配置監(jiān)控的。
  • warn:警告日志,一般的錯誤,對業(yè)務(wù)影響不大,但是需要開發(fā)關(guān)注。
  • info:信息日志,記錄排查問題的關(guān)鍵信息,如調(diào)用時間、出參入?yún)⒌鹊取?/li>
  • debug:用于開發(fā) DEBUG 的,關(guān)鍵邏輯里面的運行時數(shù)據(jù)。
  • trace:最詳細的信息,一般這些信息只記錄到日志文件中。

日常開發(fā)中,我們需要選擇恰當?shù)娜罩炯墑e,不要反手就是打印 info 哈。

日志要打印出方法的入?yún)ⅰ⒊鰠?/h3>

我們并不需要打印很多很多日志,只需要打印可以快速定位問題的有效日志。有效的日志,是甩鍋的利器!

[[426734]]

哪些算得上有效關(guān)鍵的日志呢?比如說,方法進來的時候,打印入?yún)ⅰT偃缓竽兀诜椒ǚ祷氐臅r候,就是打印出參,返回值。入?yún)⒌脑挘话憔褪?userId 或者 bizSeq 這些關(guān)鍵信息。

正例如下:

  1. public String testLogMethod(Document doc, Mode mode){ 
  2.    log.debug(“method enter param:{}”,userId); 
  3.    String id = "666"
  4.    log.debug(“method exit param:{}”,id); 
  5.    return id; 

選擇合適的日志格式

理想的日志格式,應(yīng)當包括這些最基本的信息:如當前時間戳(一般毫秒精確度)、日志級別,線程名字等等。

在 logback 日志里可以這么配置:

  1. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"
  2.     <encoder> 
  3.         <pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern> 
  4.     </encoder> 
  5. </appender>  

如果我們的日志格式,連當前時間都沒有記錄,那連請求的時間點都不知道了?

[[426735]]

遇到 if...else... 等條件時,每個分支首行都盡量打印日志

當你碰到 if...else... 或者 switch 這樣的條件時,可以在分支的首行就打印日志,這樣排查問題時,就可以通過日志,確定進入了哪個分支,代碼邏輯更清晰,也更方便排查問題了。

[[426736]]

正例:

  1. if(user.isVip()){ 
  2.   log.info("該用戶是會員,Id:{},開始處理會員邏輯",user,getUserId()); 
  3.   //會員邏輯 
  4. }else
  5.   log.info("該用戶是非會員,Id:{},開始處理非會員邏輯",user,getUserId()) 
  6.   //非會員邏輯 

日志級別比較低時,進行日志開關(guān)判斷

對于 trace/debug 這些比較低的日志級別,必須進行日志級別的開關(guān)判斷。

正例:

  1. User user = new User(666L, "公眾號""撿田螺的小男孩"); 
  2. if (log.isDebugEnabled()) { 
  3.     log.debug("userId is: {}"user.getId()); 

因為當前有如下的日志代碼:

  1. logger.debug("Processing trade with id: " + id + " and symbol: " + symbol); 

如果配置的日志級別是 warn 的話,上述日志不會打印,但是會執(zhí)行字符串拼接操作,如果 symbol 是對象,還會執(zhí)行 toString() 方法,浪費了系統(tǒng)資源,執(zhí)行了上述操作,最終日志卻沒有打印,因此建議加日志開關(guān)判斷。

不能直接使用日志系統(tǒng)中的 API

不能直接使用日志系統(tǒng)(Log4j、Logback)中的 API,而是使用日志框架 SLF4J 中的 API。

SLF4J 是門面模式的日志框架,有利于維護和各個類的日志處理方式統(tǒng)一,并且可以在保證不修改代碼的情況下,很方便的實現(xiàn)底層日志框架的更換。

[[426737]]

正例:

  1. import org.slf4j.Logger;  
  2. import org.slf4j.LoggerFactory; 
  3.  
  4. private static final Logger logger = LoggerFactory.getLogger(TianLuoBoy.class); 

建議使用參數(shù)占位 {},而不是用 + 拼接。

反例:

  1. logger.info("Processing trade with id: " + id + " and symbol: " + symbol); 

上面的例子中,使用+操作符進行字符串的拼接,有一定的性能損耗。

正例如下:

  1. logger.info("Processing trade with id: {} and symbol : {} ", id, symbol); 

我們使用了大括號{}來作為日志中的占位符,比于使用+操作符,更加優(yōu)雅簡潔。并且,相對于反例,使用占位符僅是替換動作,可以有效提升性能。

建議使用異步的方式來輸出日志

日志最終會輸出到文件或者其它輸出流中的,IO 性能會有要求的。如果異步,就可以顯著提升 IO 性能。

除非有特殊要求,要不然建議使用異步的方式來輸出日志。以 logback 為例吧,要配置異步很簡單,使用 AsyncAppender 就行。

  1. <appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender"
  2.     <appender-ref ref="ASYNC"/> 
  3. </appender> 

不要使用 e.printStackTrace()

[[426738]]

反例:

  1. try{ 
  2.   // 業(yè)務(wù)代碼處理 
  3. }catch(Exception e){ 
  4.   e.printStackTrace(); 

正例:

  1. try{ 
  2.   // 業(yè)務(wù)代碼處理 
  3. }catch(Exception e){ 
  4.   log.error("你的程序有異常啦",e); 

理由:

  • e.printStackTrace() 打印出的堆棧日志跟業(yè)務(wù)代碼日志是交錯混合在一起的,通常排查異常日志不太方便。
  • e.printStackTrace() 語句產(chǎn)生的字符串記錄的是堆棧信息,如果信息太長太多,字符串常量池所在的內(nèi)存塊沒有空間了,即內(nèi)存滿了,那么,用戶的請求就卡住啦!

異常日志不要只打一半,要輸出全部錯誤信息

[[426739]]

反例 1:

  1. try { 
  2.     //業(yè)務(wù)代碼處理 
  3. } catch (Exception e) { 
  4.     // 錯誤 
  5.     LOG.error('你的程序有異常啦'); 
  6. }  

異常 e 都沒有打印出來,所以壓根不知道出了什么類型的異常。

反例 2:

  1. try { 
  2.     //業(yè)務(wù)代碼處理 
  3. } catch (Exception e) { 
  4.     // 錯誤 
  5.     LOG.error('你的程序有異常啦', e.getMessage()); 
  6. }  

e.getMessage() 不會記錄詳細的堆棧異常信息,只會記錄錯誤基本描述信息,不利于排查問題。

正例:

  1. try { 
  2.     //業(yè)務(wù)代碼處理 
  3. } catch (Exception e) { 
  4.     // 錯誤 
  5.     LOG.error('你的程序有異常啦', e); 
  6. }  

禁止在線上環(huán)境開啟 debug

禁止在線上環(huán)境開啟 debug,這一點非常重要。

因為一般系統(tǒng)的 debug 日志會很多,并且各種框架中也大量使用 debug 的日志,線上開啟 debug 不久可能會打滿磁盤,影響業(yè)務(wù)系統(tǒng)的正常運行。

不要記錄了異常,又拋出異常

[[426740]]

反例如下:

  1. log.error("IO exception", e); 
  2. throw new MyException(e); 

這樣實現(xiàn)的話,通常會把棧信息打印兩次。這是因為捕獲了 MyException 異常的地方,還會再打印一次。

這樣的日志記錄,或者包裝后再拋出去,不要同時使用!否則你的日志看起來會讓人很迷惑。

避免重復(fù)打印日志

避免重復(fù)打印日志,醬紫會浪費磁盤空間。如果你已經(jīng)有一行日志清楚表達了意思,避免再冗余打印。

反例如下:

  1. if(user.isVip()){ 
  2.   log.info("該用戶是會員,Id:{}",user,getUserId()); 
  3.   //冗余,可以跟前面的日志合并一起 
  4.   log.info("開始處理會員邏輯,id:{}",user,getUserId()); 
  5.   //會員邏輯 
  6. }else
  7.   //非會員邏輯 

如果你是使用 log4j 日志框架,務(wù)必在 log4j.xml 中設(shè)置 additivity=false,因為可以避免重復(fù)打印日志。

正例:

  1. <logger name="com.taobao.dubbo.config" additivity="false">  

日志文件分離

我們可以把不同類型的日志分離出去,比如 access.log,或者 error 級別 error.log,都可以單獨打印到一個文件里面。

[[426741]]

當然,也可以根據(jù)不同的業(yè)務(wù)模塊,打印到不同的日志文件里,這樣我們排查問題和做數(shù)據(jù)統(tǒng)計的時候,都會比較方便啦。

核心功能模塊,建議打印較完整的日志

我們?nèi)粘i_發(fā)中,如果核心或者邏輯復(fù)雜的代碼,建議添加詳細的注釋,以及較詳細的日志。

[[426742]]

日志要多詳細呢?腦洞一下,如果你的核心程序哪一步出錯了,通過日志可以定位到,那就可以啦。

作者:撿田螺的小男孩

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號撿田螺的小男孩

 

責(zé)任編輯:武曉燕 來源: 撿田螺的小男孩
相關(guān)推薦

2020-12-02 11:18:50

print調(diào)試代碼Python

2020-12-04 10:05:00

Pythonprint代碼

2020-10-10 06:25:36

日志原理搜索

2022-08-28 16:54:02

開發(fā)日志Java

2019-06-27 17:18:02

Java日志編程語言

2023-07-31 09:12:39

B+樹節(jié)點B+Tree

2020-06-15 08:12:51

try catch代碼處理器

2020-12-11 09:24:19

Elasticsear存儲數(shù)據(jù)

2021-05-11 07:10:18

標準庫DjangoOS

2024-06-12 13:54:37

編程語言字符串代碼

2020-12-15 08:06:45

waitnotifyCondition

2025-02-10 08:05:03

2019-01-21 09:19:05

5G

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2020-12-01 11:18:34

對外接口枚舉

2021-05-20 08:30:47

運維日志打印

2015-11-16 10:29:00

2021-02-05 06:41:52

運維生產(chǎn)日志重復(fù)打印

2020-09-22 09:05:45

MySQLUTF-8utf8mb4

2022-10-27 21:34:28

數(shù)據(jù)庫機器學(xué)習(xí)架構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 黄色大片网站 | 日韩欧美视频在线 | 欧美网站一区 | 免费福利视频一区二区三区 | 国产精品一区二区三区久久久 | 美女视频一区 | 免费一级片 | 天堂精品 | 精品国产一区二区三区av片 | 亚洲欧美精品在线观看 | 欧美性生活一区二区三区 | 四虎海外 | 精品欧美二区 | 国产黄色av网站 | 日本一区二区在线视频 | 久久成人免费视频 | 久久久久久久久蜜桃 | 在线看片福利 | 在线免费观看黄色 | 免费黄色片视频 | 免费一级片| 精品久久久久久久久久久久 | 亚洲精品一区二区三区蜜桃久 | 羞羞视频在线观免费观看 | 亚洲欧洲精品一区 | 自拍偷拍在线视频 | 国产人成在线观看 | 欧美男人天堂 | 亚洲免费福利视频 | 久久激情五月丁香伊人 | 日日夜夜天天干 | 在线小视频| 一级毛片观看 | 一区二区三区在线 | 亚洲一区在线日韩在线深爱 | 国产成人免费 | 亚洲电影一区二区三区 | 日韩中文字幕在线观看视频 | 亚洲成人精选 | 丝袜 亚洲 另类 欧美 综合 | 国产精品欧美一区二区三区不卡 |