日志函数

一个简单的日志函数示例,使用宏实现日志的打印和显示。

不足:没有考虑多线程的文件操作问题;宏较长,使用宏会使得代码体积膨胀。

#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

发表评论