首页 > 代码库 > 根据需要分等级的打印日志(C语言)

根据需要分等级的打印日志(C语言)

 

在程序遇到问题调试时,有时候需要打印一些中间变量,观察完调试完又需要把这些打印注释掉,感觉很麻烦。所以写了一个小程序,可以设置打印日志等级。

在主程序设置要打印的日志等级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 }

至此,第一篇随笔结束。希望多多有意义的指教。



根据需要分等级的打印日志(C语言)