日志函数
一个简单的日志函数示例,使用宏实现日志的打印和显示。
不足:没有考虑多线程的文件操作问题;宏较长,使用宏会使得代码体积膨胀。
#include <stdio.h> #include <time.h> #include <string> #define __MODULE__ "main" std::string get_time() { time_t t = time(0); char tmp[64]; strftime(tmp, sizeof(tmp), "%Y/%m/%d %X", localtime(&t)); return std::string(tmp); } #define LOG_NOTICE 0 #define LOG_WARNING 1 #define LOG_ERROR 2 #define LOG(LEVEL,fmt,...)\ do{\ FILE * fp = fopen("log.txt", "a+");\ if(fp){\ if(LOG_NOTICE == LEVEL){\ fprintf(stdout,"NOTICE:[%s][%s]:[%s:%d]"fmt"\n",get_time().c_str(),__MODULE__,__FILE__,__LINE__,##__VA_ARGS__);\ fprintf(fp,"NOTICE:[%s][%s]:[%s:%d]"fmt"\n",get_time().c_str(),__MODULE__,__FILE__,__LINE__,##__VA_ARGS__);\ }\ if(LOG_WARNING == LEVEL){\ fprintf(stdout,"WARNING:[%s][%s]:[%s:%d]"fmt"\n",get_time().c_str(),__MODULE__,__FILE__,__LINE__,##__VA_ARGS__);\ fprintf(fp,"WARNING:[%s][%s]:[%s:%d]"fmt"\n",get_time().c_str(),__MODULE__,__FILE__,__LINE__,##__VA_ARGS__);\ }\ if(LOG_ERROR == LEVEL){\ fprintf(stdout,"ERROR:[%s][%s]:[%s:%d]"fmt"\n",get_time().c_str(),__MODULE__,__FILE__,__LINE__,##__VA_ARGS__);\ fprintf(fp,"ERROR:[%s][%s]:[%s:%d]"fmt"\n",get_time().c_str(),__MODULE__,__FILE__,__LINE__,##__VA_ARGS__);\ }\ fclose(fp);\ }\ }while(0) #define NOTICE(fmt,...) LOG(LOG_NOTICE, fmt, ##__VA_ARGS__) #define WARNING(fmt,...) LOG(LOG_WARNING, fmt, ##__VA_ARGS__) #define ERROR(fmt,...) LOG(LOG_ERROR, fmt, ##__VA_ARGS__) int main() { int i = 2015; char * notice = "Hello World"; NOTICE(" %s %d", notice, i); // NOTICE:[2015/09/02 22:08:37][main]:[h:\programming\anything\main.cpp:83] Hello World 2015 return 1; }
作者:JarvisChu
原文链接:日志函数
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0