用于调试的printf函数和自定义log函数
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去掉即可
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 ;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号