向来写的调试信息都是随意输出,无论是查看起来还是写起代码来都不方便,于是写了一个debug信息输出库,便于输出debug信息。
debug信息分为close,info,warning,error,critical五级,分别以不同的颜色输出,使用DEBUG1,DEBUG2,DEBUG3,DEBUG4宏来调用,全局变量g_debug定义为0时,关闭debug信息输出,高等级会使低于这个等级的debug信息输出,高于的则不输出,如g_debug=3,DEBUG1,DEBUG2,DEBUG3的都会输出,DEBUG4则不输出,这样用起来方便多了。
代码如下:
/* *************************** * print.h * * define debug information * * author: [email protected] * * **************************/ #ifndef __PRINT_H__ #define __PRINT_H__ #include #include #include #include #define FD stdout #define COLOR_CODE(CODES) "\033[" CODES "m" #define BLACK COLOR_CODE("30") #define RED COLOR_CODE("31") #define GREEN COLOR_CODE("32") #define YELLOW COLOR_CODE("33") #define BLUE COLOR_CODE("34") #define PURPLE COLOR_CODE("35") #define CYAN COLOR_CODE("36") #define WHITE COLOR_CODE("37") #define MODE_CODE(CODES) "\033[" CODES "m" #define BRIGHT MODE_CODE("1") #define UNDERLINE MODE_CODE("4") #define FLASH MODE_CODE("5") #define INVERSE MODE_CODE("7") #define NONE MODE_CODE("0") #define PRINT_ANSI_START(MODE,COLOR) fputs(MODE,FD); \ fputs(COLOR,FD) #define PRINT_ANSI_STOP fputs(NONE,FD); \ fputs("\n",FD) typedef enum debug_Level { DEBUG_NONE = -1, DEBUG_INFO, DEBUG_WARNING, DEBUG_ERROR, DEBUG_CRITICAL }debug_Level; typedef struct debug_St { debug_Level level; char* msg_head; char* mode; char* color; }debug_St; void inline DebugPrint(debug_Level level, const char* file, const int line, const char* fmt, ...); #define DEBUG(level, file, line, fmt, ...) DebugPrint(level, file, line, fmt, ##__VA_ARGS__) #define DEBUG1(fmt, ...) if(g_debug-1 > DEBUG_NONE) \ DEBUG(DEBUG_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define DEBUG2(fmt, ...) if(g_debug-1 > DEBUG_INFO) \ DEBUG(DEBUG_WARNING, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define DEBUG3(fmt, ...) if(g_debug-1 > DEBUG_WARNING) \ DEBUG(DEBUG_ERROR, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define DEBUG4(fmt, ...) if(g_debug-1 > DEBUG_ERROR) \ DEBUG(DEBUG_CRITICAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #endif //__PRINT_H__
/* **************************** * print.c * * debug information function * * author: [email protected] * * ***************************/ #include "print.h" static debug_St debug_st[] = { {DEBUG_INFO, "[INFO]", NONE, NONE}, {DEBUG_WARNING, "[WARNING]", BRIGHT, YELLOW}, {DEBUG_ERROR, "[ERROR]", BRIGHT, RED}, {DEBUG_CRITICAL,"[CRITITAL]", UNDERLINE BRIGHT, RED}, }; void inline DebugPrint(debug_Level level, const char* file, const int line, const char* fmt, ...) { va_list args; PRINT_ANSI_START(debug_st[level].mode, debug_st[level].color); fprintf(FD,"%s[%s %d]",debug_st[level].msg_head, file,line); va_start(args, fmt); vfprintf(FD, fmt, args); va_end(args); PRINT_ANSI_STOP; fflush(FD); }
/* ********************************** * logtest.c * * testing debug information * * using parameter '-d' '-dd' etc. * * author: [email protected] * ***********************************/ #include #include "print.h" void usage(); int g_debug = 0; int main(int argc, char **argv) { int i = 1; char *server = NULL; for (i = 0; i