专栏中心

EEPW首页 > 专栏 > C实现日志等级控制

C实现日志等级控制

发布人:电子禅石 时间:2020-08-03 来源:工程师 发布文章
C实现日志等级控制
#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 = 1;

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[20*1024];
        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) - 1] = '\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 = 0;
    printf("%d\n", SJXC_REAL_DEBUG_LEVEL);
    SJXC_print_debuf_usage();
    while( i != 32) {
        SJXC_log_msg_print(SJXC_ERROR, __FILE__, __func__, __LINE__, "1234567890");
        i++;
    }
  return 0;
}
#endif

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

SK海力士宣布全球首次向客户提供“12层HBM4”样品

Microgate的自适应光学技术在深空探索中大显身手

2025-03-19

Atmel单片机应用技巧

AVR 单片机与GCC 编程V1.1版

现金鼓励原创

Gao 2003-03-11

TI工程师讲解最新高性能模拟芯片AFE5805

视频 2010-03-17

英伟达发表硅光子网络交换器,采台积电COUPE封装技术

AT93C46or56or55串行EEPROM及单片机程序

AT93C46 56 55串行EEPROM及单片机程序

AVR 单片机GCC 程序设计

开关模式电源开始采用GaN开关

外媒评黄仁勋演讲:缺少重磅利好 没能刺激股价

新思科技携手AMD推出业界最高效能硬件辅助验证产品

黄仁勋宣布新一代AI芯片英伟达Rubin芯片,明年下半年推出

博通续拿 Google 第七代 TPU 订单

智能计算 2025-03-19

英伟达正式发布Blackwell Ultra,黄仁勋预告下一代超级芯片

采用单片FPGA支持多种工业以太网协议

视频 2010-03-17

百度安全负责人回应“开盒”事件:数据不是从百度泄露的 已取证

智能计算 2025-03-19

使用1080p视频工作台,加速您的视频格式转换

视频 2010-03-17

在Arria II GX收发器FPGA上实现PCIe、XAUI和3G-SDI

视频 2010-03-17

TI用在工业里的Sigma-Delta调制器

视频 2010-03-17
更多 培训课堂
更多 焦点
更多 视频

技术专区