#define LOG_FAULT (1 << 0) #define LOG_ERROR (1 << 1) #define LOG_WARN (1 << 2) #define LOG_INFO (1 << 3) #define LOG_DEBUG (1 << 4) #define TRACE(trace,fmt, ...) do { if ((global_trace & (trace)) == LOG_FAULT) printf("[FAULT] <%s> "fmt"", __FUNCTION__, ##__VA_ARGS__); else if ((global_trace & (trace)) == LOG_ERROR) printf("[ERROR] <%s> "fmt"", __FUNCTION__, ##__VA_ARGS__); else if ((global_trace & (trace)) == LOG_WARN) printf("[WARN] <%s> "fmt"", __FUNCTION__, ##__VA_ARGS__); else if ((global_trace & (trace)) == LOG_INFO) printf("[INFO] <%s> "fmt"", __FUNCTION__, ##__VA_ARGS__); else if ((global_trace & (trace)) == LOG_DEBUG) printf("[DEBUG] <%s> "fmt"", __FUNCTION__, ##__VA_ARGS__); } while(0)
当然严格说来,这不能算日志输出,只能算多级打印消息。
global_trace可以是宏,也可以是变量,假如是宏的话,代表在编译时指定输出级别,比如我们调试代码时设定为0x1F,就是所有消息全部输出,但是交给用户的可以设为0xF,这时debug消息就不会输出。
但是也可以是变量,那么用户就能在启动时决定输出哪些级别的信息。
总之我觉得这段代码是很精巧的值得推荐。