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

  • CVLOG 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • CVLOG_EVERY_N 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • CVLOG_AFTER_N 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • CVLOG_N_TIMES 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • VLOG 宏
  • DCVLOG 宏
  • DVLOG 宏
  • VLOG_EVERY_N 宏
  • VLOG_AFTER_N 宏
  • VLOG_N_TIMES 宏

在上一篇我们分析了 检查宏,今天来看看 日志宏的实现。

VERBOSE

CVLOG 宏

宏展开

宏定义如下:
#define CVLOG(vlevel, …) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换…
用个具体的例子就一目了然了:
CVLOG(1, “default”);

上面实际展开后为:
CVERBOSE(el::base::Writer, 1, el::base::DispatchAction::NormalLog, “default”);

而 是另外一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE(writer, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength (__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE(writer, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏定义如下:
#if (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))
# define ELPP_VERBOSE_LOG 1
#else
# define ELPP_VERBOSE_LOG 0
#endif // (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))

和 用于启用 日志级别。
值为 0 时,直接就是 , 类在 宏展开 中已经介绍过了,这里就不多说了。
这里我们直接看 宏值为 1 的情况:
#define CVERBOSE(writer, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__);

再次展开后为:
if (VLOG_IS_ON(1))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 1).construct(el_getVALength(“default”), “default”);

也是一个宏:
#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))

宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。
将 宏和 宏替换后,最终展开后为:
if(ELPP->vRegistry()->allowed(1, __FILE__))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 1).construct(1, “default”);

宏定义如下:

CVLOG
#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换…

##
__VA_ARGS__

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

CVLOG(1, "default");

上面实际展开后为:

CVERBOSE(el::base::Writer, 1, el::base::DispatchAction::NormalLog, "default");

而 是另外一个宏:

CVERBOSE
#if ELPP_VERBOSE_LOG
#define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength (__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏定义如下:

ELPP_VERBOSE_LOG
#if (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))
# define ELPP_VERBOSE_LOG 1
#else
# define ELPP_VERBOSE_LOG 0
#endif  // (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))

和 用于启用 日志级别。
值为 0 时,直接就是 , 类在 宏展开 中已经介绍过了,这里就不多说了。
这里我们直接看 宏值为 1 的情况:

ELPP_DISABLE_VERBOSE_LOGS
ELPP_LOGGING_ENABLED
VERBOSE
ELPP_INFO_LOG
el::base::NullWriter()
el::base::NullWriter
CLOG
ELPP_INFO_LOG
#define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__);

再次展开后为:

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

也是一个宏:

VLOG_IS_ON
#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))

宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。

el_getVALength
CLOG
el_getVALength("default")

将 宏和 宏替换后,最终展开后为:

VLOG_IS_ON
el_getVALength
if(ELPP->vRegistry()->allowed(1, __FILE__))
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 1).construct(1, "default");

源码剖析

接口后面介绍 日志时会进行详细分析,这里简单提一下这个接口的作用: 是否允许指定文件记录指定级别的详细日志 。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的 日志时,创建 的对象并初始化,反之则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口后面介绍 日志时会进行详细分析,这里简单提一下这个接口的作用: 是否允许指定文件记录指定级别的详细日志 。

ELPP->vRegistry()->allowed
VERBOSE

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的 日志时,创建 的对象并初始化,反之则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

VERBOSE
el::base::Writer
el::base::Writer
CLOG

CVLOG_EVERY_N 宏

宏展开

宏定义如下:
#define CVLOG_EVERY_N(n, vlevel, …)\
CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换
用个具体的例子就一目了然了:
CVLOG_EVERY_N(3, 2, “default”);

上面实际展开后为:
CVERBOSE_EVERY_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, …) \
CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:
CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)

展开后为:
CVERBOSE_IF(el::base::Writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

和上面一样,这里直接看 宏值为 1 的情况:
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)

继续展开后为:
if (VLOG_IS_ON(2) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(el_getVALength(“default”), “default”);

宏在前面已经介绍过了,这里就不多说了。
宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。
将 宏和 宏替换后,最终展开为:
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, “default”);

宏定义如下:

CVLOG_EVERY_N
#define CVLOG_EVERY_N(n, vlevel, ...)\
    CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换

##
__VA_ARGS__
...

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

CVLOG_EVERY_N(3, 2, "default");

上面实际展开后为:

CVERBOSE_EVERY_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_EVERY_N
#if ELPP_VERBOSE_LOG
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) \
    CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
CVLOG
el::base::NullWriter
CLOG
ELPP_VERBOSE_LOG
CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)

展开后为:

    CVERBOSE_IF(el::base::Writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_IF
#if ELPP_VERBOSE_LOG
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

和上面一样,这里直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)

继续展开后为:

if (VLOG_IS_ON(2) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(el_getVALength("default"), "default");  

宏在前面已经介绍过了,这里就不多说了。
宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。

VLOG_IS_ON
el_getVALength
CLOG
el_getVALength("default")

将 宏和 宏替换后,最终展开为:

VLOG_IS_ON
el_getVALength
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, "default");  

源码剖析

接口在前面 中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数有是指定的次数的倍数时则返回真。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志时并且给定的偶尔记日志的次数是 3 的倍数时,创建 对象并初始化,否则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口在前面 中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数有是指定的次数的倍数时则返回真。

ELPP->vRegistry()->allowed
CVLOG
ELPP->validateEveryNCounter

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志时并且给定的偶尔记日志的次数是 3 的倍数时,创建 对象并初始化,否则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

el::base::Writer
el::base::Writer
CLOG

CVLOG_AFTER_N 宏

宏展开

宏定义如下:
#define CVLOG_AFTER_N(n, vlevel, …)\
CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换
用个具体的例子就一目了然了:
CVLOG_AFTER_N(3, 2, “default”);

上面实际展开后为:
CVERBOSE_AFTER_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, …) \
CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:
CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:
CVERBOSE_IF(el::base::Writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, “default”);

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateAfterNCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, “default”);

宏定义如下:

CVLOG_AFTER_N
#define CVLOG_AFTER_N(n, vlevel, ...)\
    CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换

##
__VA_ARGS__
...

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

CVLOG_AFTER_N(3, 2, "default");

上面实际展开后为:

CVERBOSE_AFTER_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_AFTER_N
#if ELPP_VERBOSE_LOG
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) \
    CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
CVLOG
el::base::NullWriter
CLOG
ELPP_VERBOSE_LOG
CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:

CVERBOSE_IF(el::base::Writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, "default");

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:

CVERBOSE_IF
CVLOG_EVERY_N
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateAfterNCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, "default");  

源码剖析

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数大于等于指定的次数时则返回真。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数大于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数大于等于指定的次数时则返回真。

ELPP->vRegistry()->allowed
CVLOG
ELPP->validateAfterNCounter

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数大于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

el::base::Writer
el::base::Writer
CLOG

CVLOG_N_TIMES 宏

宏展开

宏定义如下:
#define CVLOG_N_TIMES(n, vlevel, …)\
CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换
用个具体的例子就一目了然了:
CVLOG_N_TIMES(3, 2, “default”);

上面实际展开后为:
CVERBOSE_N_TIMES(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, …) \
CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:
CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:
CVERBOSE_IF(el::base::Writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, “default”);

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateNTimesCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, “default”);

宏定义如下:

CVLOG_AFTER_N
#define CVLOG_N_TIMES(n, vlevel, ...)\
    CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换

##
__VA_ARGS__
...

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

CVLOG_N_TIMES(3, 2, "default");

上面实际展开后为:

CVERBOSE_N_TIMES(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_AFTER_N
#if ELPP_VERBOSE_LOG
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) \
    CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
CVLOG
el::base::NullWriter
CLOG
ELPP_VERBOSE_LOG
CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:

CVERBOSE_IF(el::base::Writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, "default");

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:

CVERBOSE_IF
CVLOG_EVERY_N
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateNTimesCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, "default");  

源码剖析

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数小于等于指定的次数时则返回真。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数小于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数小于等于指定的次数时则返回真。

ELPP->vRegistry()->allowed
CVLOG
ELPP->validateNTimesCounter

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数小于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

el::base::Writer
el::base::Writer
CLOG

VLOG 宏

宏定义如下:
#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG
#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG

DCVLOG 宏

宏定义如下:
#define DCVLOG(vlevel, …) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)

宏在 CLOG 宏展开 已经仔细介绍过了。
宏在前面已经仔细介绍过了。

宏定义如下:

DCVLOG
#define DCVLOG(vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)

宏在 CLOG 宏展开 已经仔细介绍过了。
宏在前面已经仔细介绍过了。

ELPP_DEBUG_LOG
CVLOG

DVLOG 宏

宏定义如下:
#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

DVLOG
#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

DCVLOG

VLOG_EVERY_N 宏

宏定义如下:
#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG_EVERY_N
#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG_EVERY_N

VLOG_AFTER_N 宏

宏定义如下:
#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG_AFTER_N
#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG_AFTER_N

VLOG_N_TIMES 宏

宏定义如下:
#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG_N_TIMES
#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG_N_TIMES

至此, 日志宏就介绍完了,下一篇我们开始介绍日志格式的配置与加载。

VERBOSE
————————
  • CVLOG 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • CVLOG_EVERY_N 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • CVLOG_AFTER_N 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • CVLOG_N_TIMES 宏宏展开源码剖析
  • 宏展开
  • 源码剖析
  • VLOG 宏
  • DCVLOG 宏
  • DVLOG 宏
  • VLOG_EVERY_N 宏
  • VLOG_AFTER_N 宏
  • VLOG_N_TIMES 宏

在上一篇我们分析了 检查宏,今天来看看 日志宏的实现。

VERBOSE

CVLOG 宏

宏展开

宏定义如下:
#define CVLOG(vlevel, …) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换…
用个具体的例子就一目了然了:
CVLOG(1, “default”);

上面实际展开后为:
CVERBOSE(el::base::Writer, 1, el::base::DispatchAction::NormalLog, “default”);

而 是另外一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE(writer, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength (__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE(writer, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏定义如下:
#if (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))
# define ELPP_VERBOSE_LOG 1
#else
# define ELPP_VERBOSE_LOG 0
#endif // (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))

和 用于启用 日志级别。
值为 0 时,直接就是 , 类在 宏展开 中已经介绍过了,这里就不多说了。
这里我们直接看 宏值为 1 的情况:
#define CVERBOSE(writer, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__);

再次展开后为:
if (VLOG_IS_ON(1))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 1).construct(el_getVALength(“default”), “default”);

也是一个宏:
#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))

宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。
将 宏和 宏替换后,最终展开后为:
if(ELPP->vRegistry()->allowed(1, __FILE__))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 1).construct(1, “default”);

宏定义如下:

CVLOG
#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换…

##
__VA_ARGS__

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

CVLOG(1, "default");

上面实际展开后为:

CVERBOSE(el::base::Writer, 1, el::base::DispatchAction::NormalLog, "default");

而 是另外一个宏:

CVERBOSE
#if ELPP_VERBOSE_LOG
#define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength (__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏定义如下:

ELPP_VERBOSE_LOG
#if (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))
# define ELPP_VERBOSE_LOG 1
#else
# define ELPP_VERBOSE_LOG 0
#endif  // (! defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))

和 用于启用 日志级别。
值为 0 时,直接就是 , 类在 宏展开 中已经介绍过了,这里就不多说了。
这里我们直接看 宏值为 1 的情况:

ELPP_DISABLE_VERBOSE_LOGS
ELPP_LOGGING_ENABLED
VERBOSE
ELPP_INFO_LOG
el::base::NullWriter()
el::base::NullWriter
CLOG
ELPP_INFO_LOG
#define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__);

再次展开后为:

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

也是一个宏:

VLOG_IS_ON
#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))

宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。

el_getVALength
CLOG
el_getVALength("default")

将 宏和 宏替换后,最终展开后为:

VLOG_IS_ON
el_getVALength
if(ELPP->vRegistry()->allowed(1, __FILE__))
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 1).construct(1, "default");

源码剖析

接口后面介绍 日志时会进行详细分析,这里简单提一下这个接口的作用: 是否允许指定文件记录指定级别的详细日志 。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的 日志时,创建 的对象并初始化,反之则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口后面介绍 日志时会进行详细分析,这里简单提一下这个接口的作用: 是否允许指定文件记录指定级别的详细日志 。

ELPP->vRegistry()->allowed
VERBOSE

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的 日志时,创建 的对象并初始化,反之则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

VERBOSE
el::base::Writer
el::base::Writer
CLOG

CVLOG_EVERY_N 宏

宏展开

宏定义如下:
#define CVLOG_EVERY_N(n, vlevel, …)\
CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换
用个具体的例子就一目了然了:
CVLOG_EVERY_N(3, 2, “default”);

上面实际展开后为:
CVERBOSE_EVERY_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, …) \
CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:
CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)

展开后为:
CVERBOSE_IF(el::base::Writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

和上面一样,这里直接看 宏值为 1 的情况:
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, …) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)

继续展开后为:
if (VLOG_IS_ON(2) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(el_getVALength(“default”), “default”);

宏在前面已经介绍过了,这里就不多说了。
宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。
将 宏和 宏替换后,最终展开为:
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, “default”);

宏定义如下:

CVLOG_EVERY_N
#define CVLOG_EVERY_N(n, vlevel, ...)\
    CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换

##
__VA_ARGS__
...

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

CVLOG_EVERY_N(3, 2, "default");

上面实际展开后为:

CVERBOSE_EVERY_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_EVERY_N
#if ELPP_VERBOSE_LOG
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) \
    CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
CVLOG
el::base::NullWriter
CLOG
ELPP_VERBOSE_LOG
CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)

展开后为:

    CVERBOSE_IF(el::base::Writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_IF
#if ELPP_VERBOSE_LOG
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
#else
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

和上面一样,这里直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
#define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
    el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)

继续展开后为:

if (VLOG_IS_ON(2) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(el_getVALength("default"), "default");  

宏在前面已经介绍过了,这里就不多说了。
宏在 宏展开 中已经详细分析过了,表示可变参的数目,这里 值为 1。

VLOG_IS_ON
el_getVALength
CLOG
el_getVALength("default")

将 宏和 宏替换后,最终展开为:

VLOG_IS_ON
el_getVALength
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateEveryNCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, "default");  

源码剖析

接口在前面 中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数有是指定的次数的倍数时则返回真。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志时并且给定的偶尔记日志的次数是 3 的倍数时,创建 对象并初始化,否则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口在前面 中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数有是指定的次数的倍数时则返回真。

ELPP->vRegistry()->allowed
CVLOG
ELPP->validateEveryNCounter

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志时并且给定的偶尔记日志的次数是 3 的倍数时,创建 对象并初始化,否则啥也不干。 类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

el::base::Writer
el::base::Writer
CLOG

CVLOG_AFTER_N 宏

宏展开

宏定义如下:
#define CVLOG_AFTER_N(n, vlevel, …)\
CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换
用个具体的例子就一目了然了:
CVLOG_AFTER_N(3, 2, “default”);

上面实际展开后为:
CVERBOSE_AFTER_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, …) \
CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:
CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:
CVERBOSE_IF(el::base::Writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, “default”);

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateAfterNCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, “default”);

宏定义如下:

CVLOG_AFTER_N
#define CVLOG_AFTER_N(n, vlevel, ...)\
    CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换

##
__VA_ARGS__
...

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

CVLOG_AFTER_N(3, 2, "default");

上面实际展开后为:

CVERBOSE_AFTER_N(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_AFTER_N
#if ELPP_VERBOSE_LOG
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) \
    CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
CVLOG
el::base::NullWriter
CLOG
ELPP_VERBOSE_LOG
CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:

CVERBOSE_IF(el::base::Writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, "default");

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:

CVERBOSE_IF
CVLOG_EVERY_N
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateAfterNCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, "default");  

源码剖析

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数大于等于指定的次数时则返回真。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数大于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数大于等于指定的次数时则返回真。

ELPP->vRegistry()->allowed
CVLOG
ELPP->validateAfterNCounter

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数大于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

el::base::Writer
el::base::Writer
CLOG

CVLOG_N_TIMES 宏

宏展开

宏定义如下:
#define CVLOG_N_TIMES(n, vlevel, …)\
CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换
用个具体的例子就一目了然了:
CVLOG_N_TIMES(3, 2, “default”);

上面实际展开后为:
CVERBOSE_N_TIMES(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, “default”);

也是一个宏:
#if ELPP_VERBOSE_LOG
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, …) \
CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, …) el::base::NullWriter()
#endif // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:
CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:
CVERBOSE_IF(el::base::Writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, “default”);

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateNTimesCounter(__FILE__, __LINE__, 3)))
el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, “default”);

宏定义如下:

CVLOG_AFTER_N
#define CVLOG_N_TIMES(n, vlevel, ...)\
    CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)

其中 是连字符, 原样替换

##
__VA_ARGS__
...

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

CVLOG_N_TIMES(3, 2, "default");

上面实际展开后为:

CVERBOSE_N_TIMES(el::base::Writer, 3, 2, el::base::DispatchAction::NormalLog, "default");

也是一个宏:

CVERBOSE_AFTER_N
#if ELPP_VERBOSE_LOG
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) \
    CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
#else
#define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
#endif  // ELPP_VERBOSE_LOG

宏前面 宏中已经介绍过了。
类在 宏展开 中已经介绍过了。
这里我们直接看 宏值为 1 的情况:

ELPP_VERBOSE_LOG
CVLOG
el::base::NullWriter
CLOG
ELPP_VERBOSE_LOG
CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)

展开后为:

CVERBOSE_IF(el::base::Writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, 3), 2, el::base::DispatchAction::NormalLog, "default");

宏在前面 宏中已经介绍过了,这里直接最后展开的结果:

CVERBOSE_IF
CVLOG_EVERY_N
if (ELPP->vRegistry()->allowed(2, __FILE__) && (ELPP->validateNTimesCounter(__FILE__, __LINE__, 3))) 
    el::base::Writer(el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, el::base::DispatchAction::NormalLog, 2).construct(1, "default");  

源码剖析

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数小于等于指定的次数时则返回真。
从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数小于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

接口在前面 宏中已经介绍过了:是否允许指定文件记录指定级别的详细日志。
接口在 偶尔日志宏 中已经介绍过了:给定的偶尔记日志的次数小于等于指定的次数时则返回真。

ELPP->vRegistry()->allowed
CVLOG
ELPP->validateNTimesCounter

从上面宏最终展开的结果来看,其实相当于:
当允许指定文件记录指定级别的详细日志并且给定的偶尔记日志的次数小于等于 3 次时,则创建 对象并初始化,否则啥也不干。
类我们在 宏 Writer 对象的创建以及初始化、日志输出、日志信息保存 已经仔细介绍过了,这里就不多说了。

el::base::Writer
el::base::Writer
CLOG

VLOG 宏

宏定义如下:
#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG
#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG

DCVLOG 宏

宏定义如下:
#define DCVLOG(vlevel, …) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)

宏在 CLOG 宏展开 已经仔细介绍过了。
宏在前面已经仔细介绍过了。

宏定义如下:

DCVLOG
#define DCVLOG(vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)

宏在 CLOG 宏展开 已经仔细介绍过了。
宏在前面已经仔细介绍过了。

ELPP_DEBUG_LOG
CVLOG

DVLOG 宏

宏定义如下:
#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

DVLOG
#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

DCVLOG

VLOG_EVERY_N 宏

宏定义如下:
#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG_EVERY_N
#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG_EVERY_N

VLOG_AFTER_N 宏

宏定义如下:
#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG_AFTER_N
#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG_AFTER_N

VLOG_N_TIMES 宏

宏定义如下:
#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

宏定义如下:

VLOG_N_TIMES
#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)

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

CVLOG_N_TIMES

至此, 日志宏就介绍完了,下一篇我们开始介绍日志格式的配置与加载。

VERBOSE