【问题标题】:using macros with various trace levels使用具有各种跟踪级别的宏
【发布时间】:2014-03-22 17:50:10
【问题描述】:

我正在一个大型 C 应用程序中设置跟踪工具。我将有多个级别的跟踪信息,这些信息将通过调用执行 syslog() 排放的函数来发出。

关于如何构建一个宏来包装测试以根据有效的跟踪级别调用函数有什么想法吗?跟踪级别是一个整数位标志。

每个较高级别都会合并每个较低级别的跟踪消息类型。即:低/中/高...设置高时,它也会发出中/低消息类型。

因此,该宏必须执行按位 OR 来查看当前有效的跟踪设置是否在每个连续的跟踪语句中包含跟踪指令。

想法??

【问题讨论】:

标签: c debugging trace


【解决方案1】:

这是一个通用方案的想法:

文件 log.h:

#ifndef LOG_H
#define LOG_H

#include <stdio.h>

typedef enum
{
    LOG_LEVEL_ERROR,
    LOG_LEVEL_WARN ,
    LOG_LEVEL_INFO ,
    LOG_LEVEL_DEBUG,
}
log_level_e;

extern log_level_e log_level;

#define LOG(LEVEL,...)                          \
        do                                      \
        {                                       \
            if (log_level >= LOG_LEVEL_##LEVEL) \
                printf(__VA_ARGS__);            \
        }                                       \
        while (0)

#endif

文件 log.c:

#include <log.h>

log_level_e log_level = LOG_LEVEL_WARN; // for example

任何其他源文件:

#include <log.h>

void func() // for example
{
    LOG(ERROR,"Error: %d %s\n",1,"ab"); // will be printed
    LOG(WARN ,"Warn:  %d %s\n",2,"cd"); // will be printed
    LOG(INFO ,"Info:  %d %s\n",3,"ef"); // will not be printed
    LOG(DEBUG,"Debug: %d %s\n",4,"gh"); // will not be printed
}

如果您想在代码中为不同的模块设置不同的日志记录级别,那么您可以使用这个:

typedef enum
{
    LOG_MODULE_X, // for example
    LOG_MODULE_Y, // for example
    ...
    LOG_NUM_OF_MODULES
}
log_module_e;

extern log_level_e log_level[LOG_NUM_OF_MODULES];

#define LOG(LEVEL,MODULE,...)                                        \
        do                                                           \
        {                                                            \
            if (log_level[LOG_MODULE_##MODULE] >= LOG_LEVEL_##LEVEL) \
                printf(__VA_ARGS__);                                 \
        }                                                            \
        while (0)

请注意,在多线程应用程序中,您必须将每次对 printf 的调用替换为对函数的调用,该函数将消息中的参数发送到指定线程,该线程将执行对 @987654326 的调用@ 以顺序方式(无论您是否使用日志系统,这都是正确的)。

以下是准备和发送每条消息的方法:

void send_msg_to_log_thread(const char* data,...)
{
    char msg[MAX_SIZE_OF_LOG_MSG];
    va_list args;
    va_start(args,data);
    vsnprintf(msg,MAX_SIZE_OF_LOG_MSG,data,args);
    va_end(args);
    // Now, send the 'msg' buffer to the designated thread
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多