<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          別亂打日志了,這才是正確的打日志姿勢(shì)!

          共 6049字,需瀏覽 13分鐘

           ·

          2021-06-03 19:32

          不點(diǎn)藍(lán)字,我們哪來故事?

          每天 11 點(diǎn)更新文章,餓了點(diǎn)外賣,點(diǎn)擊 ??《無門檻外賣優(yōu)惠券,每天免費(fèi)領(lǐng)!》

          來源:lrwinx.github.io/

          • 使用slf4j
          • 打日志的正確方式
            • 什么時(shí)候應(yīng)該打日志
            • 基本格式
            • 使用[]進(jìn)行參數(shù)變量隔離
            • 不同級(jí)別的使用
            • 規(guī)范示例說明

          使用slf4j

          1. 使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。
          2. 實(shí)現(xiàn)方式統(tǒng)一使用: Logback框架

          打日志的正確方式

          什么時(shí)候應(yīng)該打日志

          1. 當(dāng)你遇到問題的時(shí)候,只能通過debug功能來確定問題,你應(yīng)該考慮打日志,良好的系統(tǒng),是可以通過日志進(jìn)行問題定為的。
          2. 當(dāng)你碰到if…else 或者 switch這樣的分支時(shí),要在分支的首行打印日志,用來確定進(jìn)入了哪個(gè)分支
          3. 經(jīng)常以功能為核心進(jìn)行開發(fā),你應(yīng)該在提交代碼前,可以確定通過日志可以看到整個(gè)流程

          基本格式

          必須使用參數(shù)化信息的方式:

          logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol);

          對(duì)于debug日志,必須判斷是否為debug級(jí)別后,才進(jìn)行使用:

          if (logger.isDebugEnabled()) {
              logger.debug("Processing trade with id: " +id + " symbol: " + symbol);
          }

          不要進(jìn)行字符串拼接,那樣會(huì)產(chǎn)生很多String對(duì)象,占用空間,影響性能。反例(不要這么做):

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

          使用[]進(jìn)行參數(shù)變量隔離

          如有參數(shù)變量,應(yīng)該寫成如下寫法:

          logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol);

          這樣的格式寫法,可讀性更好,對(duì)于排查問題更有幫助。

          不同級(jí)別的使用

          ERROR:

          基本概念

          影響到程序正常運(yùn)行、當(dāng)前請(qǐng)求正常運(yùn)行的異常情況:

          1. 打開配置文件失敗
          2. 所有第三方對(duì)接的異常(包括第三方返回錯(cuò)誤碼)
          3. 所有影響功能使用的異常,包括:SQLException和除了業(yè)務(wù)異常之外的所有異常(RuntimeException和Exception)

          不應(yīng)該出現(xiàn)的情況:

          1. 比如要使用Azure傳圖片,但是Azure未響應(yīng)

          如果有Throwable信息,需要記錄完成的堆棧信息:

          log.error("獲取用戶[{}]的用戶信息時(shí)出錯(cuò)",userName,e);

          說明

          1. 如果進(jìn)行了拋出異常操作,請(qǐng)不要記錄error日志,由最終處理方進(jìn)行處理:

          反例(不要這么做):

          try{
              ....
          }catch(Exception ex){
            String errorMessage=String.format("Error while reading information of user [%s]",userName);
            logger.error(errorMessage,ex);
            throw new UserServiceException(errorMessage,ex);
          }

          WARN

          基本概念

          不應(yīng)該出現(xiàn)但是不影響程序、當(dāng)前請(qǐng)求正常運(yùn)行的異常情況:

          1. 有容錯(cuò)機(jī)制的時(shí)候出現(xiàn)的錯(cuò)誤情況
          2. 找不到配置文件,但是系統(tǒng)能自動(dòng)創(chuàng)建配置文件

          即將接近臨界值的時(shí)候,例如:

          1. 緩存池占用達(dá)到警告線

          業(yè)務(wù)異常的記錄,比如:

          1. 當(dāng)接口拋出業(yè)務(wù)異常時(shí),應(yīng)該記錄此異常

          INFO:

          基本概念

          系統(tǒng)運(yùn)行信息

          1. Service方法中對(duì)于系統(tǒng)/業(yè)務(wù)狀態(tài)的變更
          2. 主要邏輯中的分步驟

          外部接口部分

          1. 客戶端請(qǐng)求參數(shù)(REST/WS)
          2. 調(diào)用第三方時(shí)的調(diào)用參數(shù)和調(diào)用結(jié)果

          說明

          1. 并不是所有的service都進(jìn)行出入口打點(diǎn)記錄,單一、簡(jiǎn)單service是沒有意義的(job除外,job需要記錄開始和結(jié)束,)。反例(不要這么做):

            public List listByBaseType(Integer baseTypeId) {

                 log.info("開始查詢基地");
             BaseExample ex=new BaseExample();
             BaseExample.Criteria ctr = ex.createCriteria();
             ctr.andIsDeleteEqualTo(IsDelete.USE.getValue());
             Optionals.doIfPresent(baseTypeId, ctr::andBaseTypeIdEqualTo);
                 log.info("查詢基地結(jié)束");
             return baseRepository.selectByExample(ex);

          }

          1. 對(duì)于復(fù)雜的業(yè)務(wù)邏輯,需要進(jìn)行日志打點(diǎn),以及埋點(diǎn)記錄,比如電商系統(tǒng)中的下訂單邏輯,以及OrderAction操作(業(yè)務(wù)狀態(tài)變更)。

          2. 對(duì)于整個(gè)系統(tǒng)的提供出的接口(REST/WS),使用info記錄入?yún)?/p>

          3. 如果所有的service為SOA架構(gòu),那么可以看成是一個(gè)外部接口提供方,那么必須記錄入?yún)ⅰ?/p>

          4. 調(diào)用其他第三方服務(wù)時(shí),所有的出參和入?yún)⑹潜仨氁涗浀?因?yàn)槟愫茈y追溯第三方模塊發(fā)生的問題)

          DEBUG

          基本概念

          1. 可以填寫所有的想知道的相關(guān)信息(但不代表可以隨便寫,debug信息要有意義,最好有相關(guān)參數(shù))
          2. 生產(chǎn)環(huán)境需要關(guān)閉DEBUG信息
          3. 如果在生產(chǎn)情況下需要開啟DEBUG,需要使用開關(guān)進(jìn)行管理,不能一直開啟。

          說明

          如果代碼中出現(xiàn)以下代碼,可以進(jìn)行優(yōu)化:

          //1. 獲取用戶基本薪資

          //2. 獲取用戶休假情況

          //3. 計(jì)算用戶應(yīng)得薪資

          優(yōu)化后的代碼:

          logger.debug("開始獲取員工[{}] [{}]年基本薪資",employee,year);

          logger.debug("獲取員工[{}] [{}]年的基本薪資為[{}]",employee,year,basicSalary);
          logger.debug("開始獲取員工[{}] [{}]年[{}]月休假情況",employee,year,month);

          logger.debug("員工[{}][{}]年[{}]月年假/病假/事假為[{}]/[{}]/[{}]",employee,year,month,annualLeaveDays,sickLeaveDays,noPayLeaveDays);
          logger.debug("開始計(jì)算員工[{}][{}]年[{}]月應(yīng)得薪資",employee,year,month);

          logger.debug("員工[{}] [{}]年[{}]月應(yīng)得薪資為[{}]",employee,year,month,actualSalary);

          TRACE

          基本概念

          特別詳細(xì)的系統(tǒng)運(yùn)行完成信息,業(yè)務(wù)代碼中,不要使用.(除非有特殊用意,否則請(qǐng)使用DEBUG級(jí)別替代)

          規(guī)范示例說明

          @Override
          @Transactional
          public void createUserAndBindMobile(@NotBlank String mobile, @NotNull User user) throws CreateConflictException{
              boolean debug = log.isDebugEnabled();
              if(debug){
                  log.debug("開始創(chuàng)建用戶并綁定手機(jī)號(hào). args[mobile=[{}],user=[{}]]", mobile, LogObjects.toString(user));
              }
              try {
                  user.setCreateTime(new Date());
                  user.setUpdateTime(new Date());
                  userRepository.insertSelective(user);
                  if(debug){
                      log.debug("創(chuàng)建用戶信息成功. insertedUser=[{}]",LogObjects.toString(user));
                  }
                  UserMobileRelationship relationship = new UserMobileRelationship();
                  relationship.setMobile(mobile);
                  relationship.setOpenId(user.getOpenId());
                  relationship.setCreateTime(new Date());
                  relationship.setUpdateTime(new Date());
                  userMobileRelationshipRepository.insertOnDuplicateKey(relationship);
                  if(debug){
                      log.debug("綁定手機(jī)成功. relationship=[{}]",LogObjects.toString(relationship));
                  }
                  log.info("創(chuàng)建用戶并綁定手機(jī)號(hào). userId=[{}],openId=[{}],mobile=[{}]",user.getId(),user.getOpenId(),mobile); // 如果考慮安全,手機(jī)號(hào)記得脫敏
              }catch(DuplicateKeyException e){
                  log.info("創(chuàng)建用戶并綁定手機(jī)號(hào)失敗,已存在相同的用戶. openId=[{}],mobile=[{}]",user.getOpenId(),mobile);
                  throw new CreateConflictException("創(chuàng)建用戶發(fā)生沖突, openid=[%s]",user.getOpenId());
              }
          }


          往期推薦

          微信“炸屎”功能,被玩壞了。。

          常用正則表達(dá)式最強(qiáng)整理(速查手冊(cè))

          快來?yè)尲t包!

          什么是數(shù)據(jù)湖?為什么要數(shù)據(jù)湖?如何建湖?如何ETL?



          下方二維碼關(guān)注我

          技術(shù)草根堅(jiān)持分享 編程,算法,架構(gòu)

          看完文章,餓了點(diǎn)外賣,點(diǎn)擊 ??《無門檻外賣優(yōu)惠券,每天免費(fèi)領(lǐng)!》

          朋友,助攻一把!點(diǎn)個(gè)在看
          瀏覽 49
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产无码15p | 亚洲人体视频在线观看 | 麻豆国产首发 | 成人still病可以治愈吗 | 夫妻操逼视频 |