easyloging 获取日志文件名字_easylogging++学习记录(二):流式日志

easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下:

#define LOG(LEVEL) CLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)

#define CLOG(LEVEL, ...)\C##LEVEL(el::base::Writer, el::base::DispatchAction::NormalLog, __VA_ARGS__)#if ELPP_DEBUG_LOG# define CDEBUG(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Debug, dispatchAction, __VA_ARGS__)#define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)

宏替换之后就是调用了Writer类的一个构造函数和一个construct()成员函数,等同于下面代码:

el::base::Writer(...).construct(...)

单独调用一个构造函数的话,会产生一个临时对象,在语句结束后,这个临时对象会被析构,进而触发析构函数中的日志写入逻辑,可以通过下列代码进行验证:

1 #include

2 #include

3

4 classA5{6 public:7A() { }8

9 ~A()10{11 std::cout << m_ss.str() <<:endl>

14 template

15 A& operator << (const T&t)16{17 m_ss <

21 private:22std::ostringstream m_ss;23};24

25 #define SLOG() LOG(A)

26

27 #define LOG(a) 28a()29

30 classB31{32 public:33B() {}34 ~B()35{36 std::cout << "~B()" <<:endl>

40 intmain()41{42 std::cout << ".........begin........." <<:endl slog std::cout b return>

以上代码编译输出结果如下:

$ g++ macro.cpp -o main

$ ./main

.........begin.........

first....~B()

..........middle.......~B()

.........end..........~B()

begin和middle之间两次单独调用构造函数的地方产生的临时对象,都在语句结束后被析构了,在middle和end之间,47行处,调用了构造函数构造出一个临时变量,然后通过赋值构造函数赋值给变量b,随即临时变量被析构,而变量b直到main函数结束才被析构掉。

总而言之,要对easylogging++做一层封装并保持其流式日志的特性,可以通过同样的方式,在析构函数上做手脚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值