c - using macros with various trace levels -


i'm setting trace facility in large c application. i'll have multiple levels of tracing info emitted using calls function syslog() emissions.

any ideas on how build macro wrap test invoke function based on trace level in effect? trace level integer bitflag.

each higher level incorporate each lower levels trace message type. ie: low/med/high...with high set, emit med/low message types well.

so macro have bitwise or see if current trace setting in effect incorporate trace directive @ each successive trace statement.

ideas??

here idea general scheme:

file 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,...)                          \                                              \         {                                       \             if (log_level >= log_level_##level) \                 printf(__va_args__);            \         }                                       \         while (0)  #endif 

file log.c:

#include <log.h>  log_level_e log_level = log_level_warn; // example 

any other source file:

#include <log.h>  void func() // example {     log(error,"error: %d %s\n",1,"ab"); // printed     log(warn ,"warn:  %d %s\n",2,"cd"); // printed     log(info ,"info:  %d %s\n",3,"ef"); // not printed     log(debug,"debug: %d %s\n",4,"gh"); // not printed } 

if want have different logging-levels different modules in code, can use this:

typedef enum {     log_module_x, // example     log_module_y, // example     ...     log_num_of_modules } log_module_e;  extern log_level_e log_level[log_num_of_modules];  #define log(level,module,...)                                        \                                                                   \         {                                                            \             if (log_level[log_module_##module] >= log_level_##level) \                 printf(__va_args__);                                 \         }                                                            \         while (0) 

please note in multi-threaded application, have replace each call printf call function sends arguments in message designated thread, perform calls printf in sequential manner (this true regardless of whether or not use logging system).

here how can prepare , send each message:

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 'msg' buffer designated thread } 

Comments

Popular posts from this blog

java - WrongTypeOfReturnValue exception thrown when unit testing using mockito -

php - Magento - Deleted Base url key -

android - How to disable Button if EditText is empty ? -