红联Linux门户
Linux帮助

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

发布时间:2016-08-22 10:25:45来源:linux网站作者:Yy19921015
先看一下最后的效果:
制作一个Linux下炫酷吊炸天的log输出工具
 
先说一下上面打印的内容:
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有了颜色,码起代码来也有劲了。恩,就是这样的。
 
源码地址
源码点https://github.com/geekerliu/dsd_debug
 
本文永久更新地址:http://www.linuxdiyf.com/linux/23518.html