1. 用宏定义调试用的DPRINT
#define DEBUG_ENABLE #ifdef DEBUG_ENABLE #define DPRINT(fmt, args...) fprintf(stderr, "[DPRINT...][%s %d] "fmt" ", __FILE__, __LINE__, ##args); #else #define DPRINT(fmt, ...) #endif
发布时,将#define DEBUG_ENABLE去掉即可
2. 自定义的log函数模型:
char LogLastMsg[128]; // all info of the last log, all the info to log last time int Log2Stderr = LOG_ERR; //control Loging to stderr /** * @Synopsis a log func demo * demo for how user defined module log info * * @Param priority: level of log, LOG_ERR, LOG_DEBUG etc. * @Param errno: errno * @Param fmt: format of message to log * @Param ...: args follow by fmt */ void mylog(int priority, int errno, char* fmt, ...) { DPRINT("mylog Begin..."); char priVc[][8] = {"Emerg", "Alert", "Crit", "Error", "Warning", "Notice", "Info", "Debug"}; char* priPt = priority < 0 || priority >= sizeof(priVc)/sizeof(priVc[0]) ? "Unknow priority!" : priVc[priority]; char *errMsg = errno <= 0 ? NULL : (const char*)strerror(errno); { va_list argPt; unsigned Ln; va_start(argPt, fmt); //now argPt is point to mylog's param:... Ln = snprintf(LogLastMsg, sizeof(LogLastMsg), "[mylog...][%s]: ", priPt); Ln += vsnprintf(LogLastMsg + Ln, sizeof(LogLastMsg) - Ln, fmt, argPt); if (NULL != errMsg) { Ln += snprintf(LogLastMsg + Ln, sizeof(LogLastMsg) - Ln, "%d:%s", errno, errMsg); } va_end(argPt); } //choose the log which should be show on stderr if (priority < LOG_ERR || priority <= Log2Stderr) { fprintf(stderr, "%s ", LogLastMsg); } DPRINT("log to stderr"); //always to syslog syslog(priority, "%s", LogLastMsg); if (priority <= LOG_ERR) { exit(-1); } return ; }