目录
2.1 精确时间到ms级别,用:gettimeofday(&tv, NULL);
2.2 输出格式 ,localtime(&t)的时间是1970-00-01开始的,所以要有个转换。
2.3 返回值问题,一开始自己是char* fun(),返回值不能打印,因为szTime[] 内存出了函数就没有了。所以就用了入参的形式。
本来不想造轮子,因为有很多轮子,但是学习阶段,还是都接触一下吧,自己下手实现一下。
一、主要解决两个问题点:
1、获取当前utc time;
2、按照想要的顺序格式输出log;
二、解决获取utc time
直接上代码l
2.1 精确时间到ms级别,用:gettimeofday(&tv, NULL);
因为localtime(&t)只能精确到s;
可以打开文档看下接口就明白为什么;
2.2 输出格式 ,localtime(&t)的时间是1970-00-01开始的,所以要有个转换。
2.3 返回值问题,一开始自己是char* fun(),返回值不能打印,因为szTime[] 内存出了函数就没有了。所以就用了入参的形式。
void GetUTCMs(char *result)
{
long long utcMs = -1;
const size_t SZTIME_SIZE = 255;
char szTime[SZTIME_SIZE];
//获取us单位的时间
struct timeval tv;
gettimeofday(&tv, NULL);
utcMs = tv.tv_sec;
utcMs = utcMs * 1000 + tv.tv_usec / 1000;
//只要ms的时间;因为s以上的时间可以用localtime获取,少计算
long long SECOND_DIGIT = 1000;
long mmsec = utcMs/SECOND_DIGIT >0 ? utcMs %1000 : 0;
time_t t = time(NULL);
struct tm *tm1 = localtime(&t);//只能精确到s
//转化格式成字符串
snprintf( szTime, SZTIME_SIZE,
"%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d:%3.3u [%lld]",
tm1->tm_year+1900, tm1->tm_mon+1, tm1->tm_mday,
tm1->tm_hour, tm1->tm_min,tm1->tm_sec,mmsec, time);
strncpy (result, szTime, sizeof(szTime));//copy
}
三、按照想要的顺序格式输出log
3.1有个可变参数的问题概念。
...表示可变参数(多个可变参数组成一个列表,后面有专门的指针指向他),不限定个数和类型,
还是先上代码吧:这段是将__fmt和...列表生成一个字符串
void logPrint(const char *__fmt,...)
{
char szTimeTemp[256];
GetUTCMs(&szTimeTemp);//获取当前系统时间 精确到ms
va_list ap;//初始化指向可变参数列表的指针
char string[256];
va_start(ap,__fmt);//将第一个可变参数的地址付给ap,即ap指向可变参数列表的开始
//vsprintf()功 能: 送格式化输出串到指定数组中
vsprintf(string,__fmt,ap);//将参数fmt、ap指向的可变参数一起转换成格式化字符串,放string数组中,其作用同sprintf(),只是参数类型不同
printf("%s, %s",szTimeTemp,string);
// Uart_SendString(string); //把格式化字符串从开发板串口送出去// TODO 写入文档//
va_end(ap); //ap付值为0,没什么实际用处,主要是为程序健壮性
}
3.2那么列表表示什么呢?
...列表是宏定义的:"[" __FILE__" %s Line#%d] " format "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__ 这么一连串参数;
#define Lee_LOG(format,...) logPrint("[" __FILE__" %s Line#%d] " format "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);