Trace & Error log in file

本文介绍了在大型项目中使用的Log机制,包括Trace和ErrorLog两种形式。通过实例代码展示了如何实现日期时间获取、系统时间获取及如何利用宏定义来记录调试信息和错误信息。

1. Log机制

做一些大型项目的时候,对代码的调试最有效的办法往往是最直接、最简单的log机制

即对可以出设置打印店,对应打印信息进行调试(当然是有gdb也许你会觉得很高大上,但是实际项目中,gdb比较繁琐,且比较适合老司机使用)。

如果log机制打印的好,则会事半功倍,大大提升调试的效率。博主今天就工作当中的使用到的log机制分享给大家,希望对大家有所帮助。

先看几张图:

1). Trace:
mark

格式: 日期+时间+文件名+ + : + 打印的信息

2). Error Log:
mark

格式: Time + 设备信息 + 系统信息 + 系统事件编号 + 错误信息

2. Trace code

/* 功能描述: 获取当前系统日期,并转化成字符串输出 */  
int get_date_string(char *str)
{
    time_t now;
    struct tm *tm_now;
 
    time(&now);
    tm_now = localtime(&now);

    sprintf(str,"%4d-%02d-%02d %02d:%02d:%02d",                     \
            tm_now->tm_year+1900, tm_now->tm_mon+1, tm_now->tm_mday,\
            tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);

    return 0;
}

/* 功能描述: 获取当前系统时间,返回值单位为微妙 */
uint64_t get_sys_time_usec()
{
    timeval tv;
    gettimeofday(&tv,NULL);
    return (tv.tv_usec);
}
/******************************************************************************
*宏定义: Trace_Log
*功能描述: 将中间过程信息打印到文件中
*全局影响:
*说明:必须使用宏,否则打印的函数名、行号为本函数的
* 作者:       修改时间        内容
* Jimmy     2018-03-22      创建
*
*
******************************************************************************/
#define Trace_Log(fd, fmt, arg...)                                          \
{                                                                           \
                                                                            \
    int err_code = 0;                                                       \
    char time_str[128];     /* 存储本地时间信息<年月日时分秒> */          \
    char code_info[128];        /* 存储调用的<文件-函数-行号> */           \
    char str[1024];         /* 存储传入的参数*/                                \
    char usec_str[32];      /*存放微秒*/                                    \
    /* 1. 检查输入参数是否合法 */                                             \
    if(fd < 0)                                                              \
    {                                                                       \
        printf("Input arguments [fd=%d] error! ", fd);                      \
        err_code = -1;                                                      \
    }                                                                       \
                                                                            \
    if(0 == err_code)                                                       \
    {                                                                       \   
        memset(time_str, '\0', sizeof(time_str));                           \
        memset(code_info, '\0', sizeof(code_info));                         \
        memset(str, '\0', sizeof(str));                                     \
        memset(usec_str, '\0', sizeof(usec_str));                           \
        /* 2. 获取系统时间,获取调用者的文件/函数/行号 */                  \
        get_date_string(time_str);                                          \
                                                                            \
        sprintf(usec_str, "+%06dus", get_sys_time_usec());                  \
        sprintf(code_info, ": %-10s <%-10s %u> : ", __FILE__, __FUNCTION__, __LINE__);  \
                                                                            \
        strcat(time_str, usec_str);                                         \
        strcat(time_str, code_info);    /*将两者结合*/                       \
                                                                            \
        sprintf(str, fmt, ##arg);       /*将传入的参数按格式写入到buf*/     \
                                                                            \
        /* 3. 将本地时间 - 文件/函数/行信息 - 字符串信息 写入到相应的文件中*/\
        write(fd, (void *)time_str, strlen(time_str));                      \
        usleep(1000);                                                       \
        write(fd, (void *)str, strlen(str));                                \
        usleep(1000);                                                       \
        write(fd, "\n", 1);                                                 \
    }                                                                       \
}

3. Error Log code

/******************************************************************************
*宏定义: Error_Log
*功能描述: 将错误信息打印到文件中

*说明:必须使用宏,否则打印的函数名、行号为本函数的
* 作者:       修改时间        内容
* Jimmy     2018-03-28      创建
*
*
******************************************************************************/

#define Error_Log(fmt, arg...)                                          \
{                                                                               \
    char tmp[64];                                                               \
    char time_str[128];     /* 存储本地时间信息<年月日时分秒> */          \
    char code_info[64];     /* 存储调用的<文件-函数-行号> */               \
    char usec_str[12];      /*存储微妙时间*/                              \
    char error_info[512];       /*存储错误信息*/                              \
    char dev_id[15];            /*存储设备的ID信息*/                           \
    char systemVer[8];      /*存储系统的版本号*/                            \
    char process[8];        /*存储运行软件的版本号*/                      \
    char stm32Ver[8];           /*存储底层硬件的版本号*/                      \
                                                                                \
    if(g_err_fd != -1)                                                          \
    {                                                                           \       
        memset(time_str, '\0', sizeof(time_str));                           \
        memset(code_info, '\0', sizeof(code_info));                         \
        memset(usec_str, '\0', sizeof(usec_str));                           \
                                                                                \
        memset(dev_id, '\0', sizeof(dev_id));                               \
        memset(systemVer, '\0', sizeof(systemVer));                         \
        memset(process, '\0', sizeof(process));                     \
        memset(stm32Ver, '\0', sizeof(stm32Ver));                           \
                                                                                \
        memset(error_info, '\0', sizeof(error_info));                           \
        memset(tmp, '\0', sizeof(tmp));                                         \
                                                                                \
        /* 1. 获取时间值 */                                                      \
        get_date_string(time_str);                                          \
        sprintf(usec_str, "+%06dus", (get_sys_time_usec()%1000000LLU)); \
        strcat(time_str, usec_str);                                         \
        write(g_err_fd, "\nTIME\t\t\t\t: ", strlen("\nTIME\t\t\t\t: "));        \
        write(g_err_fd, (void *)time_str, strlen(time_str));                \
        write(g_err_fd, "\n", 1);                                               \
                                                                                \
        /* 2. 获取设备id和软件版本信息 (这些根据实际项目修改*/                   \
        GetSysCmdInfo(dev_id, "read_misc mid | tr -d '\n'");                    \
        GetSysCmdInfo(systemVer, "read_misc version | tr -d '\n'");         \
        GetSysCmdInfo(process, "read_misc software_version | tr -d '\n'");  \
        GetSysCmdInfo(stm32Ver, "read_misc stm32_version | tr -d '\n'");        \
                                                                                \   
        write(g_err_fd, "DEVICE_ID\t\t\t: ", strlen("DEVICE_ID\t\t\t: "));      \
        write(g_err_fd, (void *)dev_id, strlen(dev_id));                    \
        write(g_err_fd, "\n", 1);                                               \
                                                                                \
        write(g_err_fd, "SYSTEM_VERSION\t\t: ", strlen("SYSTEM_VERSION\t\t: "));\
        write(g_err_fd, (void *)systemVer, strlen(systemVer));              \
        write(g_err_fd, "\n", 1);                                               \
                                                                                \
        write(g_err_fd, "PROCESS\t\t\t: ", strlen("PROCESS\t\t: "));\
        write(g_err_fd, (void *)process, strlen(process));          \
        write(g_err_fd, "\n", 1);                                               \
                                                                                \
        write(g_err_fd, "SYSTEM_EVENT\t\t: ", strlen("SYSTEM_EVENT\t\t: "));    \
        write(g_err_fd, (void *)stm32Ver, strlen(stm32Ver));                \
        write(g_err_fd, "\n", 1);                                               \
                                                                                \
        /* 3. 获取文件的行列信息 */                                              \
        sprintf(code_info, "FILE\t\t\t\t: %-10s <%-10s %u> : \n", __FILE__, __FUNCTION__, __LINE__);    \
        write(g_err_fd, (void *)code_info, strlen(code_info));              \
                                                                                \
        /* 4. 获取出错信息*/                                                  \
        sprintf(error_info, fmt, ##arg);                                        \   
        write(g_err_fd, "ERROR_DETAIL\t\t: " , strlen("ERROR_DETAIL\t\t: " ));  \
        write(g_err_fd, (void *)error_info, strlen(error_info));                \
        write(g_err_fd, "\n", 1);                                               \
                                                                                \
        /* 5. 写入结束信息 */                                                 \
        for(int i=0; i < sizeof(tmp)-1; i++)                                    \
        {tmp[i]='-';}                                                           \
        tmp[sizeof(tmp)-1] = '\0';                                              \
        write(g_err_fd, (void *)tmp, strlen(tmp));                              \
        write(g_err_fd, "\n", 1);                                               \
        bzero(tmp, sizeof(tmp));                                                \
    }                                                                           \
                                                                                \
    else                                                                        \
    {                                                                           \
        printf("The g_err_fd was not inited !!!");                              \
    }                                                                           \
}

转载于:https://www.cnblogs.com/Jimmy1988/p/8723556.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值