簡體   English   中英

使用具有各種跟蹤級別的宏

[英]using macros with various trace levels

我正在大型C應用程序中設置跟蹤工具。 我將具有多個級別的跟蹤信息,這些信息將通過調用執行syslog()的函數來發出。

關於如何構建可以包裝測試以基於有效跟蹤級別調用函數的宏的任何想法? 跟蹤級別是整數位標志。

每個較高級別將合並每個較低級別的跟蹤消息類型。 即:低/中/高...設置高,它也將發出中/低消息類型。

因此,該宏將不得不進行按位“或”運算,以查看當前有效的跟蹤設置是否在每個連續的跟蹤語句中都合並了trace指令。

想法?

這是一個通用方案的想法:

文件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將按順序執行對printf的調用(此操作不管您是否使用日志系統,都是true。

這是您准備和發送每條消息的方法:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM