制作一个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有了颜色,腰不酸了,腿不疼了,码起代码来也有劲了。恩,就是这样的。

源码地址

源码点这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值