首页 > 编程语言 >easylogging++的那些事(四)源码分析(二)日志记录宏(二)条件日志宏

easylogging++的那些事(四)源码分析(二)日志记录宏(二)条件日志宏

时间:2022-11-28 01:55:05浏览次数:57  
标签:__ el ++ default 源码 base 日志 true ELPP

目录

在上一篇我们介绍完了 easylogging++的 其他基本日志宏,今天我们来看看条件日志宏的实现.

CLOG_IF 宏

宏展开

    CLOG_IF 宏定义如下:

    #define CLOG_IF(condition, LEVEL, ...)\
    C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)

    其中##是连字符,__VA_ARGS__ 原样替换...

Info 日志宏 CLOG_IF(xxx, INFO, xxx)

    用个具体的例子就一目了然了:

      CLOG_IF(true, INFO, "default");

    上面实际展开后为:

      CINFO_IF(el::base::Writer, true, el::base::DispatchAction::NormalLog, "default");

    CINFO_IF 也是一个宏:

    #if ELPP_INFO_LOG
    #define CINFO_IF(writer, condition_, dispatchAction, ...) \
        ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Info, dispatchAction, __VA_ARGS__)
    #else
    #define CINFO_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
    #endif // ELPP_INFO_LOG

    ELPP_INFO_LOG 宏和 el::base::NullWriter 类在 CLOG 宏展开 中已经介绍过了,这里就不多说了。
    这里我们直接看 ELPP_INFO_LOG 宏值为 1 的情况:

      ELPP_WRITE_LOG_IF(el::base::Writer, (true), el::Level::Info, el::base::DispatchAction::NormalLog, "default");

    ELPP_WRITE_LOG_IF 也是一个宏:

    #define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) \
        if (condition)                                                       \
        writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)

    展开后相当于:

    if (true)
        el::base::Writer(el::Level::Info, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(el_getVALength("default"), "default");

    el_getVALength 宏在 CLOG 宏展开 中已经详细分析过了,表示可变参的数目,这里 el_getVALength("default")值为 1,再次替换后:

    if (true)
        el::base::Writer(el::Level::Info, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

    其他日志级别宏的展开类似。

Trace 日志宏 CLOG_IF(xxx, TRACE, xxx)

    用个具体的例子就一目了然了:

      CLOG_IF(true, TRACE, "default");

    上面实际展开后为:

    CTRACE_IF(el::base::Writer, true, el::base::DispatchAction::NormalLog, "default");

    CTRACE_IF 也是一个宏:

    #if ELPP_TRACE_LOG
    #define CTRACE_IF(writer, condition_, dispatchAction, ...) \
        ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Trace, dispatchAction, __VA_ARGS__)
    #else
    #define CTRACE_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
    #endif // ELPP_TRACE_LOG

    ELPP_TRACE_LOG 宏和 el::base::NullWriter 类在 CLOG 宏展开 中已经仔细介绍过了,这里就不多说了。
    这里我们直接看 ELPP_TRACE_LOG 宏值为 1 的情况:

    ELPP_WRITE_LOG_IF(el::base::Writer, (true), el::Level::Trace, el::base::DispatchAction::NormalLog, "default");

    ELPP_WRITE_LOG_IF 宏在前面 Info 日志级别已经介绍过了,这里直接展开:

    if (true)
        el::base::Writer(el::Level::Trace, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(el_getVALength("default"), "default");

    el_getVALength 宏前面多次介绍了,表示可变参的数目,这里 el_getVALength("default")值为 1,再次替换后:

    if (true)
        el::base::Writer(el::Level::Trace, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Debug 日志宏 CLOG_IF(xxx, DEBUG, xxx)

    用个具体的例子就一目了然了:

    CLOG_IF(true, DEBUG, "default");

    上面实际展开后为:

    CDEBUG_IF(el::base::Writer, true, el::base::DispatchAction::NormalLog, "default");

    CDEBUG_IF 也是一个宏:

    #if ELPP_DEBUG_LOG
    #define CDEBUG_IF(writer, condition_, dispatchAction, ...) \
        ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Debug, dispatchAction, __VA_ARGS__)
    #else
    #define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
    #endif // ELPP_DEBUG_LOG

    ELPP_DEBUG_LOG 宏和 el::base::NullWriter 类在 CLOG 宏展开 中已经仔细介绍过了,这里就不多说了。
    这里我们直接看 ELPP_DEBUG_LOG 宏值为 1 的情况:

    ELPP_WRITE_LOG_IF(el::base::Writer, (true), el::Level::Debug, el::base::DispatchAction::NormalLog, "default");

    ELPP_WRITE_LOG_IF 宏在前面 Info 日志级别已经介绍过了,这里直接展开:

    if (true)
        el::base::Writer(el::Level::Debug, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(el_getVALength("default"), "default");

    el_getVALength 宏前面多次介绍了,表示可变参的数目,这里 el_getVALength("default")值为 1,再次替换后:

    if (true)
        el::base::Writer(el::Level::Debug, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Fatal 日志宏 CLOG_IF(xxx, FATAL, xxx)

    用个具体的例子就一目了然了:

    CLOG_IF(true, FATAL, "default");

    上面实际展开后为:

    CFATAL_IF(el::base::Writer, true, el::base::DispatchAction::NormalLog, "default");

    CFATAL_IF 也是一个宏:

    #if ELPP_FATAL_LOG
    #define CFATAL_IF(writer, condition_, dispatchAction, ...) \
        ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Fatal, dispatchAction, __VA_ARGS__)
    #else
    #define CFATAL_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
    #endif // ELPP_FATAL_LOG

    ELPP_FATAL_LOG 宏和 el::base::NullWriter 类在 CLOG 宏展开 中已经仔细介绍过了,这里就不多说了。
    这里我们直接看 ELPP_FATAL_LOG 宏值为 1 的情况:

    ELPP_WRITE_LOG_IF(el::base::Writer, (true), el::Level::Fatal, el::base::DispatchAction::NormalLog, "default");

    ELPP_WRITE_LOG_IF 宏在前面 Info 日志级别已经介绍过了,这里直接展开:

    if (true)
        el::base::Writer(el::Level::Fatal, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(el_getVALength("default"), "default");

    el_getVALength 宏前面多次介绍了,表示可变参的数目,这里 el_getVALength("default")值为 1,再次替换后:

    if (true)
        el::base::Writer(el::Level::Fatal, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Error 日志宏 CLOG_IF(xxx, ERROR, xxx)

    用个具体的例子就一目了然了:

    CLOG_IF(true, ERROR, "default");

    上面实际展开后为:

    CERROR_IF(el::base::Writer, true, el::base::DispatchAction::NormalLog, "default");

    CERROR_IF 也是一个宏:

    #if ELPP_ERROR_LOG
    #define CFATAL_IF(writer, condition_, dispatchAction, ...) \
        ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Error, dispatchAction, __VA_ARGS__)
    #else
    #define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
    #endif // ELPP_ERROR_LOG

    ELPP_ERROR_LOG 宏和 el::base::NullWriter 类在 CLOG 宏展开 中已经仔细介绍过了,这里就不多说了。
    这里我们直接看 ELPP_ERROR_LOG 宏值为 1 的情况:

    ELPP_WRITE_LOG_IF(el::base::Writer, (true), el::Level::Error, el::base::DispatchAction::NormalLog, "default");

    ELPP_WRITE_LOG_IF 宏在前面 Info 日志级别已经介绍过了,这里直接展开:

    if (true)
        el::base::Writer(el::Level::Error, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(el_getVALength("default"), "default");

    el_getVALength 宏前面多次介绍了,表示可变参的数目,这里 el_getVALength("default")值为 1,再次替换后:

    if (true)
        el::base::Writer(el::Level::Error, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Warning 日志宏 CLOG_IF(xxx, WARNING, xxx)

    用个具体的例子就一目了然了:

    CLOG_IF(true, WARNING, "default");

    上面实际展开后为:

    CWARNING_IF(el::base::Writer, true, el::base::DispatchAction::NormalLog, "default");

    CWARNING_IF 也是一个宏:

    #if ELPP_WARNING_LOG
    #define CWARNING_IF(writer, condition_, dispatchAction, ...) \
        ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Warning, dispatchAction, __VA_ARGS__)
    #else
    #define CWARNING_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
    #endif // ELPP_WARNING_LOG

    ELPP_WARNING_LOG 宏和 el::base::NullWriter 类在 CLOG 宏展开 中已经仔细介绍过了,这里就不多说了。
    这里我们直接看 ELPP_WARNING_LOG 宏值为 1 的情况:

    ELPP_WRITE_LOG_IF(el::base::Writer, (true), el::Level::Warning, el::base::DispatchAction::NormalLog, "default");

    ELPP_WRITE_LOG_IF 宏在前面 Info 日志级别已经介绍过了,这里直接展开:

    if (true)
        el::base::Writer(el::Level::Warning, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(el_getVALength("default"), "default");

    el_getVALength 宏前面多次介绍了,表示可变参的数目,这里 el_getVALength("default")值为 1,再次替换后:

    if (true)
        el::base::Writer(el::Level::Warning, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

源码分析

    从上面所有用户日志相关日志级别宏的最终展开结果可以看到: 都是创建了 el::base::Writer 类的实例,还是个临时对象。
    Writer 类我们在 CLOGWriter 对象的创建以及初始化日志输出日志信息的保存 已经仔细介绍过了,这里就不多说了。

CPLOG_IF 宏

宏展开

    CPLOG_IF 宏定义如下:

    #define CPLOG_IF(condition, LEVEL, ...) \
        C##LEVEL##_IF(el::base::PErrorWriter, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)

    其中##是连字符,__VA_ARGS__ 原样替换...
    C##LEVEL##_IF 相关宏前面已经多次分析过了,这里简单看看最终展开后的结果:

Info 日志宏 CPLOG_IF(xxx, INFO, xxx)

    用个具体的例子就一目了然了:

    CPLOG_IF(true, INFO, "default");

    最终展开后为:

    if (true)
        el::base::PErrorWriter(el::Level::Info, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Trace 日志宏 CPLOG_IF(xxx, TRACE, XXX)

    用个具体的例子就一目了然了:

    CPLOG_IF(true, TRACE, "default");

    最终展开为:

    if (true)
        el::base::PErrorWriter(el::Level::Trace, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Debug 日志宏 CPLOG_IF(xxx, DEBUG, XXX)

    用个具体的例子就一目了然了:

    CPLOG_IF(true, DEBUG, "default");

    最终展开为:

    if (true)
        el::base::PErrorWriter(el::Level::Debug, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Fatal 日志宏 CPLOG_IF(xxx, FATAL, XXX)

    用个具体的例子就一目了然了:

    CPLOG_IF(true, FATAL, "default");

    最终展开为:

    if (true)
        el::base::PErrorWriter(el::Level::Fatal, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Error 日志宏 CPLOG_IF(xxx, ERROR, XXX)

    用个具体的例子就一目了然了:

    CPLOG_IF(true, ERROR, "default");

    最终展开为:

    if (true)
        el::base::PErrorWriter(el::Level::Error, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Warning 日志宏 CPLOG_IF(xxx, WARNING, XXX)

    用个具体的例子就一目了然了:

    CPLOG_IF(true, WARNING, "default");

    最终展开为:

    if (true)
        el::base::PErrorWriter(el::Level::Warning, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

源码剖析

    从上面所有用户日志相关日志级别宏的最终展开结果可以看到: 都是创建了 el::base::PErrorWriter 类的实例,还是个临时对象。
    el::base::PErrorWriter 类在 其他基本日志宏 中已经仔细介绍过了,这里就不多说了。

CSYSLOG_IF 宏

宏展开

    CSYSLOG_IF 宏定义如下:

    #define CSYSLOG_IF(condition, LEVEL, ...) \
        C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::SysLog, __VA_ARGS__)

    其中##是连字符,__VA_ARGS__ 原样替换...
    C##LEVEL##_IF 相关宏前面已经多次分析过了,这里简单看看最终展开后的结果

Info 日志宏 CSYSLOG_IF(xxx, INFO, xxx)

    用个具体的例子就一目了然了:

    CSYSLOG_IF(true, INFO, "default");

    最终展开后为:

    if (true)
        el::base::Writer(el::Level::Info, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Trace 日志宏 CSYSLOG_IF(xxx, TRACE, XXX)

    用个具体的例子就一目了然了:

    CSYSLOG_IF(true, TRACE, "default");

    最终展开为:

    if (true)
        el::base::Writer(el::Level::Trace, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Debug 日志宏 CSYSLOG_IF(xxx, DEBUG, XXX)

    用个具体的例子就一目了然了:

    CSYSLOG_IF(true, DEBUG, "default");

    最终展开为:

    if (true)
        el::base::Writer(el::Level::Debug, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Fatal 日志宏 CSYSLOG_IF(xxx, FATAL, XXX)

    用个具体的例子就一目了然了:

    CSYSLOG_IF(true, FATAL, "default");

    最终展开为:

    if (true)
        el::base::Writer(el::Level::Fatal, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Error 日志宏 CSYSLOG_IF(xxx, ERROR, XXX)

    用个具体的例子就一目了然了:

    CSYSLOG_IF(true, ERROR, "default");

    最终展开为:

    if (true)
        el::base::Writer(el::Level::Error, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

Warning 日志宏 CSYSLOG_IF(xxx, WARNING, XXX)

    用个具体的例子就一目了然了:

    CSYSLOG_IF(true, WARNING, "default");

    最终展开为:

    if (true)
        el::base::Writer(el::Level::Warning, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog).construct(1, "default");

源码剖析

    从上面所有用户日志相关日志级别宏的最终展开结果可以看到: 都是创建了 el::base::Writer 类的实例,还是个临时对象。
    el::base::Writer 类我们在 CLOGWriter 对象的创建以及初始化日志输出日志信息的保存 中已经仔细介绍过了,这里就不多说了。

LOG_IF 宏

    LOG_IF 宏定义如下:

    #define LOG_IF(condition, LEVEL) CLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)

    CLOG_IF 宏在前面已经仔细介绍过了。

PLOG_IF 宏

    PLOG_IF 宏定义如下:

    #define PLOG_IF(condition, LEVEL) CPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)

    CPLOG_IF 宏在前面已经仔细介绍过了。

SYSLOG_IF 宏

    SYSLOG_IF 宏定义如下:

    #define SYSLOG_IF(condition, LEVEL) CSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)

    CSYSLOG_IF 宏在前面已经仔细介绍过了。

DCLOG_IF 宏

    DCLOG_IF 宏定义如下:

    #define DCLOG_IF(condition, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_IF(condition, LEVEL, __VA_ARGS__)

    CLOG_IF 宏在前面已经仔细介绍过了,这里就不多说了。

DCPLOG_IF 宏

    DCPLOG_IF 宏定义如下:

    #define DCPLOG_IF(condition, LEVEL, ...) \
        C##LEVEL##_IF(el::base::PErrorWriter, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::NormalLog, __VA_ARGS__)

    ELPP_DEBUG_LOG 宏和 C##LEVEL##_IF 相关宏在前面已经仔细介绍过了。

DCSYSLOG_IF 宏

    DCSYSLOG_IF 宏定义如下:

    #define DCSYSLOG_IF(condition, LEVEL, ...)\
        C##LEVEL##_IF(el::base::Writer, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::SysLog, __VA_ARGS__)

    ELPP_DEBUG_LOG 宏和 C##LEVEL##_IF 相关宏在前面已经仔细介绍过了。

DLOG_IF 宏

    DLOG_IF 宏定义如下:

    #define DLOG_IF(condition, LEVEL) DCLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)

    DCLOG_IF 宏在前面已经仔细介绍过了。

DPLOG_IF 宏

    DPLOG_IF 宏宏定义如下:

    #define DPLOG_IF(condition, LEVEL) DCPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)

    DCPLOG_IF 宏在前面已经仔细介绍过了。

DSYSLOG_IF 宏

    DSYSLOG_IF 宏定义如下:

    #define DSYSLOG_IF(condition, LEVEL) DCSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)

    DCSYSLOG_IF 宏在前面已经仔细介绍过了。

至此 easylogging++的条件日志宏就全部介绍完了,下一篇我们开始介绍偶尔日志宏。

标签:__,el,++,default,源码,base,日志,true,ELPP
From: https://www.cnblogs.com/DesignLife/p/16931218.html

相关文章

  • Windows系列---【NotePad++ 远程连接服务器】
    NotePad++远程连接服务器参考连接:https://blog.csdn.net/JavaLLU/article/details/118631301补充:在线安装NPPFTP  搜索NppFTP,勾选安装 ......
  • springBoot 过滤器去除请求参数前后空格(附源码)
    背景:用户在前端页面中不小心输入的前后空格,为了防止因为前后空格原因引起业务异常,所以我们需要去除参数的前后空格!如果我们手动去除参数前后空格,我们可以这样做@......
  • “一站式”家校服务系统---开发日志2
    202210-27一、教务中心业务1、班级管理1.1、学生管理1.1.1、前端项目布置复制逆向生成代码中,将src/views/modules/edu/下的文件全部复制粘贴到以下位置  1.1.2......
  • 从C语言到C++
    一、头文件区别总结:原来C语言头文件的后缀.h直接删除,在首元素前面加前缀c即可。特例:输入输出函数的头文件改动较大,前面是io,后面是stream(流)二、如何输入输出1、......
  • Netty源码-00-启动
    一源码我fork的源码带注释分支study二环境版本Netty4.1.169Java8三Samples1服务端1.1启动类/**Copyright2012TheNettyProject**......
  • c/c++刷题中的输入输出
    c/c++中的输入输出#include<iostream>usingnamespacestd;intmain(){//c语言中的输入输出inta,b;scanf("%d%d",&a,&b);printf("%d\n",a+b);......
  • easylogging++的那些事(四)源码分析(二)日志记录宏(二)其他基本日志宏
    目录CPLOG宏宏展开Info日志宏CPLOG(INFO,xxx)Trace日志宏CPLOG(TRACE,XXX)Debug日志宏CPLOG(DEBUG,XXX)Fatal日志宏CPLOG(FATAL,XXX)Error日志宏CPLOG(ERRO......
  • C++黑马程序员——P112-114. 类对象作为类成员; 静态成员; 成员变量和成员函数分开存
    P112.类和对象——对象特性——类对象作为类成员P113.类和对象——静态成员P114.类和对象——对象特性——成员变量和成员函数分开存储P112C++类中的成员可以是另......
  • LLM 日志采集
    @[TOC](Logstash+MQ日志采集)需求场景logback+MQ+Logstash采集多台服务(下文用生产端代替)的日志数据,汇总到一台服务器(下文用消费端代替)中。实现1.RabbitMQ将日志消息发布......
  • c++ chrono 时间库
    1概述--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdownchrono是c++11中的时间库包含计时,时钟等功能。2概念--ja......