您的位置:首页 > 其它

用于调试的printf函数和自定义log函数

2016-12-06 19:15 627 查看
1. 用宏定义调试用的DPRINT

#define DEBUG_ENABLE
#ifdef DEBUG_ENABLE
#define DPRINT(fmt, args...) fprintf(stderr, "[DPRINT...][%s %d] "fmt"\n", __FILE__, __LINE__, ##args);
#else
#define DPRINT(fmt, ...)
#endif
发布时,将#define DEBUG_ENABLE去掉即可

#define DPRINT(fmt, args...)  if( d_print ) printf(fmt,##args);
也可以这样,就能在传入参数时设置是否打印调试信息了。这里,如果可变参数被忽略或为空,‘##'操作将使预处理器(preprocessor)去除掉它前面的那个逗号。

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\n", LogLastMsg);
}
DPRINT("log to stderr");

//always to syslog
syslog(priority, "%s", LogLastMsg);

if (priority <= LOG_ERR)
{
exit(-1);
}
return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐