制作一个Linux下炫酷吊炸天的log输出工具

来源:互联网 发布:it培训机构排名 编辑:程序博客网 时间:2024/06/03 05:51

先看一下最后的效果

效果
先说一下上面打印的内容:
1. 最前面的是log输出的级别,现在有NOTICE、INFO、DEBUG、WARN、ERR 5个log输出等级。
2. 紧接着的是该条log输出的时间,前面的时间是秒,后面的时间是微妙。
3. 然后是这条打印语句所在的文件,函数和行号
4. 然后是具体打印的内容

如何实现

首先看一下其中的一个接口函数dsdl_err,这是一个可变参数的宏。可以类比一下printf函数,第一个是输出变量的格式,第二个参数是对应变量。

#define dsdl_err(format, args...) \    do {\        if (dsd_log_filter(DSD_ERR)) {\            fprintf(stderr,"\033[31m" "[%s->%s->%d]-> " "\033[0m",__FILE__,__func__,__LINE__);\            fprintf(stderr,"\033[31m" format "\033[0m", ##args);\        }\    }while(0)

参数传递进去后,调用dsd_log_filter。该函数判断该级别的log是否打开,如果没有打开,则什么都不做。如果打开了,就会打印当前的文件名、函数名、和行号。在打印的格式化输出里面有一个\033[31m,这就是控制输出某种颜色,\033[0m清除颜色,更多颜色可查看这里,需自备梯子。

int dsd_log_filter(int filter){    int i = 0;    if (log_level & filter) {        for (i = 0; i < DSD_COUNT; i++) {            if (filter == (1 << i)) {                dsd_time_in_microseconds(i);                return 1;            }        }    }    return 0;}

dsd_log_filter函数里面,如果调试打开了,会调用dsd_time_in_microseconds在输出前面打一个时间戳,该函数如下,简单调用系统的gettimeofday函数,然后计算出秒数和微妙数。

void dsd_time_in_microseconds(int n){    unsigned long long now;    struct timeval tv;    gettimeofday(&tv, NULL);    now = ((unsigned long long)tv.tv_sec * 1000000LL) + tv.tv_usec;    fprintf(stderr, "%s:[%llu:%d]", log_level_names[n], now / 1000000, (int)(now % 1000000));}

至此dsdl_err就分析完了,其它的log函数都是一样的流程。

总结

一个功能强大,炫酷吊炸天的log就实现了。log有了颜色,腰不酸了,腿不疼了,码起代码来也有劲了。恩,就是这样的。

源码地址

源码点这里

0 0
原创粉丝点击