根據需要分等級的列印日誌(C語言)

来源:http://www.cnblogs.com/jingmingjiayuan/archive/2017/05/10/6837863.html
-Advertisement-
Play Games

在程式遇到問題調試時,有時候需要列印一些中間變數,觀察完調試完又需要把這些列印註釋掉,感覺很麻煩。所以寫了一個小程式,可以設置列印日誌等級。 在主程式設置要列印的日誌等級debug,就把相應的等級的日誌全部打出來觀察。 程式用到了va_list(在C語言中解決變參問題的一組巨集),相關知識可參考htt ...


 

在程式遇到問題調試時,有時候需要列印一些中間變數,觀察完調試完又需要把這些列印註釋掉,感覺很麻煩。所以寫了一個小程式,可以設置列印日誌等級。

在主程式設置要列印的日誌等級debug,就把相應的等級的日誌全部打出來觀察。

程式用到了va_list(在C語言中解決變參問題的一組巨集),相關知識可參考http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html(註意鏈接文章正確的程式在評論中) 。

直接上主程式:main.cpp

 1 #include"log.h"
 2 #include<stdio.h>
 3 int debug = 2; //10 為全打  1-9只打相應等級日誌
 4 int main()
 5 {    
 6     SetDebugLevel();
 7     char s[]="abc";
 8     int k = 7;
 9     double kk = 11.5;
10     WriteLog(1 , "1-日誌是:%s\n" , "abc");
11     WriteLog(2 , "2-日誌是:%s , k:%d\n" , s , k);  //WriteLog(日誌等級,格式化字元串 ,不定個數的變數)
12     WriteLog(3 , "3-日誌是:%s , k:%d\n" , s , k);
13     WriteLog(4 , "4-日誌是:%s , k:%d\n" , s , k);
14     WriteLog(5 , "5-日誌是:%s , k:%d\n" , s , k);  //debug為5 , 則只列印這一條。
15     WriteLog(6 , "6-日誌是:%s , k:%d , kk = %lf\n" , s , k , kk);
16     printf("\n");
17     return 0;
18 }
日誌列印等級debug為2,則只列印第11行。

 日誌列印等級debug為6,則只列印第15行。

日誌列印等級debug為10,則全部列印。

 日誌列印等級為0(非1-10) , 則不做任何列印(指調用WriteLog的列印)。

調用的程式直接貼代碼:
log.h
1 void WriteLog(int , char * ,... );
2 void SetDebugLevel();

 具體實現代碼:

  log.cpp

 1 #include<stdio.h>
 2 #include <stdarg.h>
 3 
 4 extern int debug; 
 5 int debug_flag = 0;
 6 void WriteLog(int i,va_list va_alist,...)
 7 {
 8     va_list args;    
 9     int level = i;
10     va_start(args ,va_alist);
11     if(debug_flag & 1 << (level - 1))    //註意&和<<優先順序
12     {
13         vfprintf(stderr, va_alist, args);
14     }
15     va_end(args);
16 }
17 void SetDebugLevel()
18 {
19     if (debug >= 1 && debug <= 9)
20     {
21         debug_flag |= 1 << (debug-1);
22     }
23     else if(debug == 10)
24     {
25         debug_flag = 255;
26     }
27 }

至此,第一篇隨筆結束。希望多多有意義的指教。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目描述 對一個給定的自然數M,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為M。 例子:1998+1999+2000+2001+2002 = 10000,所以從1998到2002的一個自然數段為M=10000的一個解。 輸入輸出格式 輸入格式: 包含一個整數的單獨一行給出M的值(10 ...
  • 題目描述 輸入二個正整數x0,y0(2<=x0<100000,2<=y0<=1000000),求出滿足下列條件的P,Q的個數 條件: 1.P,Q是正整數 2.要求P,Q以x0為最大公約數,以y0為最小公倍數. 試求:滿足條件的所有可能的兩個正整數的個數. 輸入輸出格式 輸入格式: 二個正整數x0,y ...
  • 題目描述 科學家們在Samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型電腦“Samuel II”的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用“Samuel II”進行數學研究。 小聯最近在研究和約數有關的問題,他統計每個正數N的約數的個數,並以f(N ...
  • LeetCode : two sum 第一次寫博客,算是熟悉這些編輯環境吧,本來是打算在csdn上用markdown寫的,結果改了博客介紹就被關閉了,暈死。。。好了,話不多說,今天打算拿LeetCode上的第一題:Two Sum來分享試驗一下。 題目描述:Given an array of inte ...
  • 1.JSP頁面中設置輸入選項和驗證碼 <form action=login.do" method="post" > <div class="line_1" > <span class="line_1_span">會員登錄</span> <input type="text" class="form-c ...
  • 題目描述 n 個小伙伴(編號從 0 到 n-1)圍坐一圈玩游戲。按照順時針方向給 n 個位置編號,從0 到 n-1。最初,第 0 號小伙伴在第 0 號位置,第 1 號小伙伴在第 1 號位置,……,依此類推。游戲規則如下:每一輪第 0 號位置上的小伙伴順時針走到第 m 號位置,第 1 號位置小伙伴走到 ...
  • step1. 導包(導入要使用的標簽的jar文件)。 step2. 使用taglib指令引入要使用的標簽。 taglib指令: uri:標簽的命名空間。 prefix:命名空間的別名。 註: 命名空間:是為了區分同名的元素而添加的首碼。自定義標簽: step1. 寫一個java類,繼承SimpleT ...
  • 題目描述 春春幼兒園舉辦了一年一度的“積木大賽”。今年比賽的內容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。 在搭建開始之前,沒有任何積木(可以看成n塊高度為 0 的積木)。接下來每次操作,小朋友們可以選擇一段連續區間[l, r],然後將第第 L ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...