日志
工程项目中最常会用到的一个功能就是日志,打印到控制台或者输出到某个日志文件中,展示程序遇到的问题。
日志通常会分为几个等级:调试信息、普通信息、警告信息、错误信息、致命信息。其中错误信息表示程序出现了严重错误,可以根据实际情况,选择是否继续运行还是终止退出;致命信息是程序完全无法继续再进行下去了。
#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个时,它会将前面的','去掉,否则编译会出错。