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

在上一篇我们介绍完了 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++的条件日志宏就全部介绍完了,下一篇我们开始介绍偶尔日志宏。

原文地址:http://www.cnblogs.com/DesignLife/p/16931218.html

发表评论

您的电子邮箱地址不会被公开。