<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      再談日志系統(tǒng)

      1. 面相抽象:不直接使用 printf / std::cout

      直接使用 printf 或 std::cout 的弊端在于:不夠規(guī)模化,修改起來麻煩。

      例如,除了想往控制臺打印,還希望往文件打印; 想確保每一處打印都有 flush; 想通過 CMake Option, 用一個(gè)簡單的開關(guān)來控制日志的開啟和關(guān)閉。

      使用專門的日志庫提供的 宏/函數(shù), 而不是直接使用 printf / std::cout, 是基本的要求。

      而 Debug/Info/Warning/Error 等級的劃分, 算是日志庫的基本功能, 這里不探討了。

      2. 有區(qū)分度的打?。簩俚?tag

      在多人協(xié)作、多 SDK 集成的場景下, 所有 log 都輸出到控制臺時(shí), 怎樣區(qū)分不同模塊的日志? 每個(gè)模塊應(yīng)當(dāng)有自己獨(dú)特的 tag, 也就是顯示在日志打印的每一行的最開頭部分的, 如:

      [D] module1: xxxxx
      [D] module2: xxxxx
      

      這里的 module1module2 就是 tag。 當(dāng)程序出現(xiàn) crash,根據(jù) crash 前最后一次打印的 tag, 來判定職責(zé)在哪個(gè)模塊(SDK)中,對應(yīng)的開發(fā)負(fù)責(zé)人負(fù)責(zé)排查(也就是甩鍋、背鍋)。

      3. 自證清白:API函數(shù)的進(jìn)入-離開 log

      當(dāng)調(diào)用子模塊時(shí),子模塊的某個(gè) API 函數(shù)是否運(yùn)行完畢, 決定了誰來背鍋。例如有 f 和 g 兩個(gè)模塊, f 負(fù)責(zé)調(diào)用 g 模塊的 g1(), g2() 兩個(gè) API 函數(shù):

      f1()
        - g1()
        - g2()
      f2()
      

      當(dāng)最終的日志打印中,看到了 g2( ) 內(nèi)的日志打印、沒看到 f2() 的日志打印, 并且 f2() 代碼中確實(shí)寫了日志打印, 這時(shí)候如何裁定職責(zé)呢?

      由于我負(fù)責(zé) g 模塊, 無法主導(dǎo) f 模塊的排查, 只能在 g1(), g2() 函數(shù)中自證清白: 在 API 函數(shù)執(zhí)行的最開頭、最末尾, 增加日志打?。?/p>

      class AutoLogger
      {
      public:
          AutoLogger(const char* name):
              m_name(name)
          {
              XX_LOGD("%s begin()", name);
          }
          ~AutoLogger()
          {
              XX_LOGD("%s end()", name);
          }
      private:
          std::string m_name;
      };
      
      void g2()
      {
          AutoLogger logger(__FUNCTION__);
      
          ... // 原有代碼
          // XX_LOGD("g2() end"); // 原本有這句,但是無法保證是 g2() 最后執(zhí)行的內(nèi)容,因?yàn)榭赡苡蓄悓?shí)例的析構(gòu)函數(shù)在這句之后執(zhí)行
      }
      

      為了進(jìn)一步簡化代碼,以及避免 logger 命名沖突,改為宏定義:

      #define API_ENTER_LEAVE_LOG AutoLogger logger##__LINE__(__FUNCTION__)
      

      這樣一來,看到的日志一定是這兩種之一:

      // g 模塊沒crash
      [D] module_g: g2() begin()
      [D] module_g: .....
      [D] module_g: g2() end()
      crash info
      
      // crash 在 g 模塊內(nèi)
      [D] module_g: g2() begin()
      [D] module_g: .....
      crash info
      

      4. 保存現(xiàn)場: 多重輸出

      一個(gè)合格的日志庫, 應(yīng)當(dāng)能讓調(diào)用者同時(shí)往控制臺、文件寫入日志,并且支持用戶往其他地方寫入日志,例如 Android logcat, 或 QNX 系統(tǒng)的 slog。

      那么作為使用者,就需要這樣寫:

      
      static void custom_logger(char* line, FILE* fp)
      {
          char buf[1024];
          sprintf(buf, "%s\n", line);
          
          fprintf(stdout, "%s", buf);
          fflush(stdout);
      
          if (!fp && fp!=stdout)
          {
              fprintf(fp, "%s", buf);
              fflush(fp);
          }
      #ifdef ENABLE_SLOG
          {
              slog2(DEBUG1, "%s\n", buf);
          }
      #endif
      }
      
      static FILE* s_file = NULL;
      void g_init()
      {
          API_ENTER_LEAVE_LOG();
      
          if (s_file) 
              fclose(s_file);
          s_file = fopen("xxx.log", "wt");
          xx_log_register_logger(custom_logger);
      }
      
      void g_run()
      {
          API_ENTER_LEAVE_LOG();
           ...
      }
      

      5. 有效性探討

      個(gè)人認(rèn)為上述 log 內(nèi)容有一定正向作用,但是只能起到有限作用。 當(dāng) f 模塊遇到了 "Malloc failed: xxxx" 的報(bào)錯(cuò)時(shí),那看起來應(yīng)該是 glibc 的作者們寫 bug 了,我們應(yīng)當(dāng)找 glibc 的作者去修改 bug 嗎?有這種可能,但是也可能是調(diào)用者出了問題。

      posted @ 2024-12-22 11:28  ChrisZZ  閱讀(80)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品成人中文字幕| 日韩V欧美V中文在线| 无码人妻精品一区二区三区蜜桃| 无码人妻丰满熟妇区五十路在线| 玛曲县| 亚洲自拍偷拍福利小视频| 一区二区三区激情都市| 亚洲夂夂婷婷色拍ww47| 一区二区三区四区自拍偷拍| 成人亚洲av免费在线| 福利一区二区1000| 国产自产对白一区| 欧美www在线观看| 国产精品一区在线蜜臀| 国产成人精品一区二区三| 成在线人永久免费视频播放| 二区三区亚洲精品国产| 国产一区二区视频在线看| 制服jk白丝h无内视频网站| 鲁丝片一区二区三区免费| 国产午夜在线观看视频播放| 国产精品点击进入在线影院高清 | 人妻激情文学| 亚洲国产午夜精品福利| 无码人妻丝袜在线视频红杏| 于都县| 一 级做人爱全视频在线看| 欧美精品人人做人人爱视频| 亚洲av无码乱码在线观看野外| 国产精品久久久久久亚洲色| 国产成人免费观看在线视频| 成人性生交片无码免费看| 国产精品一区二区三区三级 | 久久人妻av无码中文专区| 国精偷拍一区二区三区| 欧美孕妇乳喷奶水在线观看 | 99久久伊人精品综合观看| 欧美男男作爱videos可播放| 综合色一色综合久久网| av午夜福利一片免费看久久| 国产gaysexchina男外卖|