生成日志logger

16 篇文章 0 订阅

目录

一、主要解决两个问题点:

二、解决获取utc time

2.1 精确时间到ms级别,用:gettimeofday(&tv, NULL);

2.2 输出格式 ,localtime(&t)的时间是1970-00-01开始的,所以要有个转换。

2.3 返回值问题,一开始自己是char* fun(),返回值不能打印,因为szTime[] 内存出了函数就没有了。所以就用了入参的形式。

三、按照想要的顺序格式输出log

3.1有个可变参数的问题概念。

3.2那么列表表示什么呢?


本来不想造轮子,因为有很多轮子,但是学习阶段,还是都接触一下吧,自己下手实现一下。

一、主要解决两个问题点:

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__);

 

http://blog.sina.com.cn/s/blog_9f1118490101h5dl.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值