我正在一个大型 C 应用程序中设置一个跟踪工具。我将拥有多个级别的跟踪信息,这些信息将通过调用执行 syslog() 排放的函数来发出。
关于如何构建一个宏来包装测试以根据有效的跟踪级别调用函数的任何想法?跟踪级别是一个整数位标志。
每个更高级别都将合并每个较低级别的跟踪消息类型。即:低/中/高...如果设置为高,它也会发出中/低消息类型。
因此该宏必须执行按位或操作,以查看当前跟踪设置是否有效地在每个连续的跟踪语句中包含跟踪指令。
想法??
最佳答案
这是一个通用方案的想法:
文件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
的每次调用替换为对函数的调用,该函数将消息中的参数发送到指定线程,该线程将执行以顺序方式调用 printf
(无论您是否使用日志系统都是如此)。
以下是准备和发送每条消息的方法:
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
}
关于c - 使用具有各种跟踪级别的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22581302/