日志

  工程项目中最常会用到的一个功能就是日志,打印到控制台或者输出到某个日志文件中,展示程序遇到的问题。

  日志通常会分为几个等级:调试信息、普通信息、警告信息、错误信息、致命信息。其中错误信息表示程序出现了严重错误,可以根据实际情况,选择是否继续运行还是终止退出;致命信息是程序完全无法继续再进行下去了。

#define LOG_LEVEL_DEBUG 0
#define LOG_LEVEL_INFO  1
#define LOG_LEVEL_WARN  2
#define LOG_LEVEL_ERROR 3
#define LOG_LEVEL_CRIT  4 

static const char *LOG_STR[] = {
     "DEBUG",
     "INFO",
     "WARN",
     "ERROR",
     "CRIT" 
};

    我们可以在配置文件中添加一条配置信息:log_level=x, x可以是0-4,表明我们希望哪些日志被输出,小于这个等级的信息会被舍弃。

    通常输出的日志信息,包含三个方面的内容:1.时间信息;2.日志等级;3.错误信息。错误信息中通常需要包含文件名、出错行、错误原因。

//配置结构通常会被设置为全局变量
Config *g_config;

//根据配置文件设置的日志输出等级将日志信息记录在日志中
#define LOG(level, format, ...) do{  \
       if(level >= g_conf->log_level) {  \
              time_t now = time(NULL);  \
              char msg[1024];  \
              char buf[32];  \
              sprintf(msg, format, ##__VA_ARGS__);  \
              strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", localtime(&now)); \
              printf(g_config->log_file, "[%s]  [%s]  %s\n", buf, LOG_STR[level], msg);  \
              fflush(stdout);  \
        }  \
        if(level >= LOG_LEVEL_ERROR)   \
              exit(-1);  \
        }  \
}while(0)

    其中_VAR_ARGS_是可变参数宏,将LOG中的可变参数'...'传递给后面的宏定义中,宏前面加上##,作用是当可变参数为0个时,它会将前面的','去掉,否则编译会出错。

posted on 2017-05-14 01:15  残余的光  阅读(302)  评论(0编辑  收藏  举报

导航