【NanoLog】工作线程源码剖析

本文深入剖析NanoLog的工作线程源码,重点讲解NANO_LOG宏的使用和log函数的实现。NANO_LOG宏包含日志级别和格式化字符串,利用constexpr函数在编译期处理参数。log函数通过StaticLogInfo存储静态信息,并在首次打印时注册。动态信息处理涉及参数大小计算、内存分配和参数写入缓存,利用模板元编程优化处理效率。

【NanoLog】工作线程源码剖析

NanoLogCpp17.h

NANO_LOG宏

使用示例:

NANO_LOG(NOTICE, “Hello World! This is an integer %d and a double %lf\r\n”, 1, 2.0);

#define NANO_LOG(severity, format, ...) 

第一个参数是LogLevel:一个enum类型,表示日志消息的级别。

第二个参数format:是格式化字符串

会被调用

constexpr int numNibbles = NanoLogInternal::getNumNibblesNeeded(format);
template<size_t N>
constexpr int
getNumNibblesNeeded(const char (&fmt)[N])
{
    int numNibbles = 0;
    for (int i = 0; i < countFmtParams(fmt); ++i) {
        ParamType t = getParamInfo(fmt, i);
        if (t == NON_STRING || t == DYNAMIC_PRECISION || t == DYNAMIC_WIDTH)
            ++numNibbles;
    }
        return numNibbles;
}

getNumNibblesNeeded是一个constexpr函数,如果参数在编译期已知,就可以在编译期间进行运算了。还是一个模板函数,根据fmt的数组长度会泛化不同的函数。

countFmtParames会根据fmt计算出有多少个参数,最后得到需要多少个numNibbles: 存储所有参数所需的nibbles数量

constexpr int nParams = NanoLogInternal::countFmtParams(format);

nParams就从fmt中获得一共有多少个参数

  • numNibbles:格式化字符串中,非字符串类型的参数个数,比如%d%l等参数的个数
  • nParams: 格式化字符串中,参数的个数,相当于是%的个数

下面这些必须是 "静态 "的,这样我们就可以保存这些变量的指针,并让它们在调用之后继续存在。静态的logId被用来将这个局部范围(与#NANO_LOG的扩展相联系)与一个ID联系起来,paramTypes数组被压缩函数使用,该函数在另一个线程中被调用在一个更晚的时间调用。

       //paramTypes在编译期就算出来了,是一个存放参数类型,长度为参数个数的数组。
    //通过调用analyzeFormaString模板函数,模板参数是参数个数,函数实参是格式化字符串
   static constexpr std::array<NanoLogInternal::ParamType, nParams> paramTypes = \
                                NanoLogInternal::analyzeFormatString<nParams>(format); \
    static int logId = NanoLogInternal::UNASSIGNED_LOGID; \
  • paramTypes:格式化字符串中,所有参数的参数类型, 即将%…映射为NanoLog内部定义的Param
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值