#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h> #define SJXC_LOG_DEBUG(level, format, arg...) SJXC_log_msg_print(level, __FILE__, __func__, __LINE__, format, ##arg) #ifdef SJXC_DISABLE_DEBUG
#define SJXC_REAL_DEBUG_LEVEL 0
#else
#define SJXC_REAL_DEBUG_LEVEL SJXC_DEBUG_LEVEL
#endif #define SJXC_ERROR (1 << 0)
#define SJXC_WARN (1 << 1)
#define SJXC_INFO (1 << 2)
#define SJXC_DEBUG (1 << 3) int SJXC_DEBUG_LEVEL = ; struct SJXC_gdb {
int level;
const char *msg;
}; struct SJXC_gdb SJXC_gdb_table[] = {
{SJXC_ERROR, "Config the log level as error."},
{SJXC_WARN, "Config the log level as warn."},
{SJXC_INFO, "Config the log level as info."},
{SJXC_DEBUG, "Config the log level as DEBUG."}
}; void SJXC_print_debuf_usage(void)
{
struct SJXC_gdb *p_gdb;
fprintf(stderr,
" To calculate the debug level, logically 'or'\n"
" some of the following values together to get a bebug level:\n");
for (p_gdb = SJXC_gdb_table; p_gdb < SJXC_gdb_table + (sizeof(SJXC_gdb_table) / sizeof(struct SJXC_gdb)); p_gdb++) {
fprintf(stderr, "\t%d:\t%s\n", p_gdb->level, p_gdb->msg);
}
fprintf(stderr, "\n");
} void SJXC_log_msg_print(int level, const char *file, const char *func, const int line, char *fmt, ...)
{
char *status; switch (level) {
case SJXC_ERROR:
status = "ERROR";
break;
case SJXC_WARN:
status = "WRAN";
break;
case SJXC_INFO:
status = "INFO";
break;
case SJXC_DEBUG:
status = "DEBUG";
break;
default:
printf("Debug message level ERROR!\n");
} if (SJXC_REAL_DEBUG_LEVEL & level) {
char msg_buf[*];
char *ascii_time_buf;
time_t tnow = time(NULL);
va_list ap; ascii_time_buf = asctime(localtime(&tnow));
ascii_time_buf[strlen(ascii_time_buf) - ] = '\0'; va_start(ap, fmt);
sprintf(msg_buf, " ------> [ %s %s:%s:%d ] %s ", ascii_time_buf, file, func, line, status);
vsprintf(msg_buf + strlen(msg_buf), fmt, ap);
fprintf(stderr, "%s\n", msg_buf);
va_end(ap);
}
} #if 1
int main(void)
{
int i = ;
printf("%d\n", SJXC_REAL_DEBUG_LEVEL);
SJXC_print_debuf_usage();
while( i != ) {
SJXC_log_msg_print(SJXC_ERROR, __FILE__, __func__, __LINE__, "");
i++;
}
  return ;
}
#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. 51Nod大数加法(两个数正负都可)

    很多大数的问题都运用模拟的思想,但是这个说一样也一样,但是难度较大,很麻烦,我自己谢写了100多行的代码,感觉很对,但就是WA.其实个人感觉C和C++没有大数类,是对人思想和算法的考验,但是有时候做不 ...

  2. Android进阶——Crash异常捕获并发送到服务器

    在项目中,我们常常会遇到Crash的现象,也就是程序崩溃的时候,这个时候最常看到的就是这个界面 如果你的项目已经发布到市场上了,这样的崩溃对于开发人员是看不到的,所以我们得想方法将崩溃信息发送到服务器 ...

  3. 当我们进行综合和I/O布局后会发生什么QwQ

    基于的平台是Vivado 2018.2 本文主要以一个简单的半加器加器(组合逻辑为例)学习vivado的综合,I/O配置的一些内容. 本人小白,记一些自己的理解. 任务: 分析Log文件. 布局I/O ...

  4. 5.GIT使用问题

    1.git命令显示总是像less 一样的效果问题 git config --global pager.branch false

  5. 吴裕雄--天生自然MySQL学习笔记:MySQL 及 SQL 注入

    如果通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符. 所谓SQL注入,就是通 ...

  6. SpringContextHolder类

    1.通常使用SpringContextHolder类获取bean实例: 解决: 如果要在静态方法中调用某一bean的方法,那么该bean必须声明为static的,但正常情况下@Autowired无法注 ...

  7. this 深度面试题3

    window.val = 1; var obj = { val: 2, dbl: function () { this.val *= 2; val *= 2; console.log(val); co ...

  8. Python说文解字_继承过程中的参数集合

    1. 先看一段属性继承的代码: class User: def __init__(self,name,age): self.name = name self.age = age class User1 ...

  9. LeetCode——560. 和为K的子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不 ...

  10. 黑马_13 Spring Boot:05.spring boot 整合其他技术

    13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 05.spring boot 整合其他 ...