<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>

          日志瘦身騷操作:從5G優(yōu)化到1G!

          共 2928字,需瀏覽 6分鐘

           ·

          2022-07-17 18:24

          點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
          真愛,請(qǐng)?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看”

          文章來源:https://c1n.cn/mtr19


          目錄
          • 背景

          • 日志瘦身方法論

          • 優(yōu)化案例

          • 總結(jié)


          背景


          在日常開發(fā)中,通常為了方便調(diào)試、方便查問題,會(huì)打印很多 INFO 級(jí)別的日志。


          隨著訪問量越來越大,一不小心,某個(gè)日志文件一天的 size 就大于了某個(gè)閾值(如 5G),于是,收到了優(yōu)化日志大小的告警,一定時(shí)間內(nèi)不優(yōu)化反饋給你主管,囧...


          日志過大容易導(dǎo)致一些運(yùn)維操作消耗機(jī)器性能,如日志文件檢索、數(shù)據(jù)采集、磁盤清理等。


          那么,日志瘦身哪些常見的思路呢?本文結(jié)合某個(gè)具體案例談?wù)勎业目捶ā?/span>


          日志瘦身方法論



          | 只打印必要的日志

          有時(shí)候?yàn)榱朔奖銣y(cè)試,臨時(shí)打印很多 INFO 級(jí)別日志。對(duì)于這種日志,等項(xiàng)目上線前,可以將非必要的日志刪除或者調(diào)整為 DEBUG 級(jí)別。


          但有些場(chǎng)景下有些日志可打印為 DEBUG 也可打印為 INFO,打印成 INFO 級(jí)別占空間,打印成 DEBUG 級(jí)別線上查問題的時(shí)候又需要用到,腫么辦?

          我們可以對(duì)日志工具類進(jìn)行改造,支持上下文傳遞某個(gè)開關(guān)時(shí)(正常調(diào)用沒有這個(gè)開關(guān),通過公司的 Tracer 或者 RPC上下文傳遞),可以臨時(shí)將 DEBUG日志提升為 INFO級(jí)別。


          偽代碼如下:
          if(log.isDebugEnable()){
             log.debug(xxx);
          }else if(TracerUtils.openDebug2Info()){
           log.info("【debug2info】"+xxx);
          }


          這樣,可以將一些糾結(jié)是否要打印成 INFO 日志的 log 打印成 DEBUG 級(jí)別,查問題時(shí)自動(dòng)提升為INFO 日志。


          為了避免誤會(huì),區(qū)分 DEBUG 提升 INFO  的日志和普通 INFO 日志,加上類似【debug2info】 日志前綴。

          當(dāng)然,你也可以搞一些其他騷操作,這里只是舉個(gè)例子,請(qǐng)自行舉一反三。


          | 合并打印

          有些可以合并的日志,可以考慮合并。


          如在同一個(gè)方法前后都打印了 INFO 日志:
          INFO   [64 位traceId]   XXXService 執(zhí)行前  size =10 INFO   [64 位traceId]   XXXService 執(zhí)行后  size =4


          可以合并成一條:
          INFO [64 位traceId] XXXService 執(zhí)行前 size =10 執(zhí)行后 size =4


          | 簡(jiǎn)化&縮寫&壓縮

          某個(gè)日志非常有必要,但是打印的對(duì)象有些大,如果可以滿足問題排查需求的情況下,我們可以:

          • 選擇只打印其 ID

          • 創(chuàng)建一個(gè)只保留關(guān)鍵字段的日志專用對(duì)象,轉(zhuǎn)化為日志專用對(duì)象,再打印。

          • 可以用縮寫,如 write 簡(jiǎn)化為 w, read 簡(jiǎn)化為 r,execute 簡(jiǎn)化為 e 等;比如 pipeline 中有 20 個(gè)核心 bean ,打印日志時(shí)可以使用不同的編號(hào)替代 bean 全稱,如 S1,S2 ,雖然沒那么直觀,但既可以查問題,又降低了日志量。


          優(yōu)化案例


          | 場(chǎng)景描述

          一個(gè)業(yè)務(wù)場(chǎng)景涉及很多 bean,為了復(fù)用一些通用邏輯,這些 bean 都繼承自某個(gè)抽象類。


          在抽象類中,定義了執(zhí)行 bean 前后的一些通用邏輯,如執(zhí)行前后打印當(dāng)前 pipeline 中 item 的數(shù)量。最后一個(gè) bean 執(zhí)行完結(jié)果轉(zhuǎn)換后需要打印出結(jié)果。


          | 優(yōu)化分析

          ①只打印必要日志


          只打印必要日志:

          • 由于當(dāng)前 bean 執(zhí)行前 相當(dāng)于前一個(gè) bean 執(zhí)行后,因此只打印執(zhí)行后的日志就可以,執(zhí)行前的 INFO 日志可以刪除或者改為 DEBUG (只打印必要日志)

          • 通常問題只出現(xiàn)在執(zhí)行前后 size 不一致的情況下,因此執(zhí)行后打印日志前可以加個(gè)判斷,如果執(zhí)行前后 size 相同則不打印。


           偽代碼如下:
          if(sizeBefore != sizeAfter){
          log.info("service:{}, 前size:{},后size:{}", getName(),sizeBefore, sizeAfter)
          }


          這招效果很明顯,因?yàn)榇蠖鄶?shù) bean 的執(zhí)行前后 size 是相同的,就不會(huì)打印這條日志。而假設(shè)之前有 20 個(gè),這條日志就需要打印 20次,改進(jìn)后可能只需要打印 2-3 次。


          ②日志合并


          為了方便查問題還需要打印執(zhí)行前的 size ,那么將執(zhí)行前的 size 記錄在內(nèi)存中,打印執(zhí)行后日志時(shí)多打印出執(zhí)行前的 size。


          偽代碼如下:
          log.info("service:{}, 執(zhí)行前size:{}", getName(),sizeBefore)

          log.info("service:{}, 執(zhí)行后size:{}", getName(),sizeBeforesizeAfter)


          合并后:
          log.info("service:{}, 前size:{},后size:{}", getName(),sizeBeforesizeAfter)


          ③日志精簡(jiǎn)

          對(duì)于最終結(jié)果,將結(jié)果對(duì)象(如 XXDTO)轉(zhuǎn)化為只包括關(guān)鍵信息,如 id, title 的日志對(duì)象(XXSimpleLogDTO),轉(zhuǎn)化為日志對(duì)象后再打印。
          log.info("resultId:{}",result.getId());


          或者:
          log.info("result:{}",toSimpleLog(result));


          | 效果評(píng)估

          該日志一天產(chǎn)生 5G 左右,這里百分之 80% 左右都是打印執(zhí)行前后的 size,10% 左右是打印最終結(jié)果,還有一些其他的日志。


          經(jīng)過上述方法優(yōu)化后,每天日志量不足 1G。

          在滿足排查問題的需要,又實(shí)現(xiàn)日志瘦身之間進(jìn)行了取舍。


          總結(jié)


          日志瘦身需要進(jìn)行權(quán)衡,保留排查問題的必要日志情況下盡可能精簡(jiǎn)。可以采用刪除不必要日志,合并日志,日志簡(jiǎn)化等方式進(jìn)行優(yōu)化。


          我們還可以進(jìn)行一些騷操作,支持線上 DEBUG 臨時(shí)提升 INFO(當(dāng)然也可以使用 arthas)來輔助我們查問題。


          你還有哪些不錯(cuò)的日志瘦身技巧?歡迎在文章末尾評(píng)論和我交流。


          (完)

          碼農(nóng)突圍資料鏈接

          1、臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開放下載!
          2、計(jì)算機(jī)基礎(chǔ)知識(shí)總結(jié)與操作系統(tǒng) PDF 下載
          3、艾瑪,終于來了!《LeetCode Java版題解》.PDF
          4、Github 10K+,《LeetCode刷題C/C++版答案》出爐.PDF

          歡迎添加魚哥個(gè)人微信:smartfish2020,進(jìn)粉絲群或圍觀朋友圈。

          瀏覽 34
          點(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>
                  成人网站视频免费在线观看 | 俺去啦俺去也www官网 | 一二三无码 | 男女啪啪免费网址 | 久久久久久三级 |