1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #include <time.h>
  6.  
  7. #define SJXC_LOG_DEBUG(level, format, arg...) SJXC_log_msg_print(level, __FILE__, __func__, __LINE__, format, ##arg)
  8.  
  9. #ifdef SJXC_DISABLE_DEBUG
  10. #define SJXC_REAL_DEBUG_LEVEL 0
  11. #else
  12. #define SJXC_REAL_DEBUG_LEVEL SJXC_DEBUG_LEVEL
  13. #endif
  14.  
  15. #define SJXC_ERROR (1 << 0)
  16. #define SJXC_WARN (1 << 1)
  17. #define SJXC_INFO (1 << 2)
  18. #define SJXC_DEBUG (1 << 3)
  19.  
  20. int SJXC_DEBUG_LEVEL = ;
  21.  
  22. struct SJXC_gdb {
  23. int level;
  24. const char *msg;
  25. };
  26.  
  27. struct SJXC_gdb SJXC_gdb_table[] = {
  28. {SJXC_ERROR, "Config the log level as error."},
  29. {SJXC_WARN, "Config the log level as warn."},
  30. {SJXC_INFO, "Config the log level as info."},
  31. {SJXC_DEBUG, "Config the log level as DEBUG."}
  32. };
  33.  
  34. void SJXC_print_debuf_usage(void)
  35. {
  36. struct SJXC_gdb *p_gdb;
  37. fprintf(stderr,
  38. " To calculate the debug level, logically 'or'\n"
  39. " some of the following values together to get a bebug level:\n");
  40. for (p_gdb = SJXC_gdb_table; p_gdb < SJXC_gdb_table + (sizeof(SJXC_gdb_table) / sizeof(struct SJXC_gdb)); p_gdb++) {
  41. fprintf(stderr, "\t%d:\t%s\n", p_gdb->level, p_gdb->msg);
  42. }
  43. fprintf(stderr, "\n");
  44. }
  45.  
  46. void SJXC_log_msg_print(int level, const char *file, const char *func, const int line, char *fmt, ...)
  47. {
  48. char *status;
  49.  
  50. switch (level) {
  51. case SJXC_ERROR:
  52. status = "ERROR";
  53. break;
  54. case SJXC_WARN:
  55. status = "WRAN";
  56. break;
  57. case SJXC_INFO:
  58. status = "INFO";
  59. break;
  60. case SJXC_DEBUG:
  61. status = "DEBUG";
  62. break;
  63. default:
  64. printf("Debug message level ERROR!\n");
  65. }
  66.  
  67. if (SJXC_REAL_DEBUG_LEVEL & level) {
  68. char msg_buf[*];
  69. char *ascii_time_buf;
  70. time_t tnow = time(NULL);
  71. va_list ap;
  72.  
  73. ascii_time_buf = asctime(localtime(&tnow));
  74. ascii_time_buf[strlen(ascii_time_buf) - ] = '\0';
  75.  
  76. va_start(ap, fmt);
  77. sprintf(msg_buf, " ------> [ %s %s:%s:%d ] %s ", ascii_time_buf, file, func, line, status);
  78. vsprintf(msg_buf + strlen(msg_buf), fmt, ap);
  79. fprintf(stderr, "%s\n", msg_buf);
  80. va_end(ap);
  81. }
  82. }
  83.  
  84. #if 1
  85. int main(void)
  86. {
  87. int i = ;
  88. printf("%d\n", SJXC_REAL_DEBUG_LEVEL);
  89. SJXC_print_debuf_usage();
  90. while( i != ) {
  91. SJXC_log_msg_print(SJXC_ERROR, __FILE__, __func__, __LINE__, "");
  92. i++;
  93. }
  94.   return ;
  95. }
  96. #endif

C实现日志等级控制的更多相关文章

  1. log4cplus使用(二)-自定义日志等级

    log4cplus支持用户自定义日志等级,操作也比较简单,使用之前贴如下宏定义 #define LOG4CPLUS_MACRO_CREASH_LOG_LEVEL(pred) LOG4CPLUS_UNL ...

  2. 13.scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是s ...

  3. python日志等级输出删选

    有时候我们会删选一下输出的信息 当做日志进行文件保存 但是我们程序中有可能有自己不想存到日志文件中的输出信息 我们要做一些的删选  然后进行保存 代码如下: #!/usr/bin/python # - ...

  4. scrapy之日志等级

    scrapy之日志等级 在settings.py中配置如下项: LOG_LEVEL = 'ERROR' # 当LOG_LEVEL设置为ERROR时,在进行日志打印时,只是打印ERROR级别的日志 这样 ...

  5. scrapy框架的日志等级和请求传参

    日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息 ...

  6. uniGUI日志的控制

    uniGUI日志的控制 (2015-10-12 08:30:29) 转载▼ 标签: unigui 分类: uniGUI uniGUI本身提供了日志功能,利用uniServerModule.Server ...

  7. scrapy框架之日志等级和请求传参-cookie-代理

    一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...

  8. Scrapy的日志等级和请求传参

    日志等级 日志信息:   使用命令:scrapy crawl 爬虫文件 运行程序时,在终端输出的就是日志信息: 日志信息的种类: ERROR:一般错误: WARNING:警告: INFO:一般的信息: ...

  9. CEF之CefSettings设置日志等级

    CefSettings结构体允许定义全局的CEF配置,经常用到的配置项如下: single_process 设置为true时,Browser和Renderer使用一个进程.此项也可以通过命令行参数“s ...

随机推荐

  1. iOS下JS与原生的交互一

    本篇主要讲的是UIWebView和JS的交互,在下一节会有wkWebView和JS交互的详解https://www.cnblogs.com/llhlj/p/9144110.html JS调用原生OC ...

  2. POJ-3629 模拟

    A - Card Stacking Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  3. 给指定的div增加滚动条

    这次的需求是给一个指定的div(里面有个table表格)增加上下.左右的滚动条 通过查找资料后找到了一个可用的方法,代码如下: <!--div比table大小要小才会显示--> <d ...

  4. Android自定义View——多边形网格属性图

      1.初始化变量 2.属性图解   3.如果想切换到5.6.7边形等等,则必须修改下面几条数据 4.获取宽和高 5.绘制图形 1.开始画画前:我们要把画笔准备好,这里看代码就能明白意思了,接着把整个 ...

  5. 2020/2/1 PHP代码审计之变量覆盖漏洞

    0x00 变量覆盖简介 变量覆盖是指变量未被初始化,我们自定义的参数值可以替换程序原有的变量值. 0x01 漏洞危害 通常结合程序的其他漏洞实现完整的攻击,比如文件上传页面,覆盖掉原来白名单的列表,导 ...

  6. Tensorflow学习教程------非线性回归

    自己搭建神经网络求解非线性回归系数 代码 #coding:utf-8 import tensorflow as tf import numpy as np import matplotlib.pypl ...

  7. soupui--替换整个case的url

    添加新的URL 随便进入一个case的[REST]step,添加新的url 更换URL 添加完之后双击想要更换url的case,在弹出的窗口中点击URL按钮 在弹出的set endpoint窗口中选择 ...

  8. 吴裕雄--天生自然 JAVASCRIPT开发学习:DOM EventListener

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. AI 领域与概述

    概述 数据分析行业主要的职业发展. 业务:业务分析师.数据产品经理.产品总监 技术:算法师.架构师.研发经理.研发总监 美工:BI工程师 人工智能,是数据分析的子集.人工智能主要包括 语音识别 自然语 ...

  10. min25筛学习笔记

    min25筛简介:用来求积性函数F(x)前缀和的,复杂度O(n0.75/logn),大概能求n<=1010. 记一个数x的最小质因子为R(x),所以当x不为质数时,R(x)<=√x这是废话 ...