boost的log库

boost 1.54.0新增了一个log库,鉴于boost的质量,应该对这个log库充满期待。最近研究这个log库发现它的学习曲线很陡峭。boost.log目标其实是想成为一个大的框架,可以完成复杂的任务同时还具有高扩展性,而不是仅仅做一个调试打log的工具。这就导致boost.log里面的包含了很多组件,想要发挥它强大的功能就需要对它本身很了解,使用起来比较复杂。

我简单介绍一下它的宏,背后那些record、Attribute、sink、source、filter、formatter、core等概念就不说。

为了保持代码简洁,重命名一下boost.log的命名空间:
namespace logging = boost::log;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;

Trivial logging

boost还是提供一个最简单的打log接口。

我们只需包含trivial.hpp这个头文件,就可以使用宏BOOST_LOG_TRIVIAL向控制台输出不同等级的log。用法跟std::cout很类似。虽然很简单,但是它有以下几个优点:

  1. 除了我们输入的log字符串,BOOST_LOG_TRIVIAL还会输出log时间戳,线程标识符,log等级
  2. 保证打log操作的线程安全性
  3. 可以应用过滤器,过滤某些log

使用过滤器

我们可以根据log的等级设置过滤器,过滤掉某些log。上面的代码就是只输出>=info等级的log。过滤器还可以随时设置,并只对它之后执行的log操作生效。

还有一点是只有通过过滤器的代码才会被执行,比如上面的ia值,如果ia所在的log被过滤掉了,ia的值就得不到增加。

因为BOOST_LOG_TRIVIAL使用的是boost内置的全局过滤器,所以我们使用logging::core::get()获得一个全局单件实例。

log输出到文件

我们经常会把log记录到文件里。boost.log里面通过add_file_log设置如何记录log到文件里。

logger

logger就是往log系统中写入记录的写入者。我们使用BOOST_LOG_TRIVIAL时不需要关注logger,boost.log会自动使用全局的logger。我们也可以自己定义logger,然后用BOOST_LOG去使用这个logger。

使用log等级

还可以使用BOOST_LOG_SEV:

定义输出的格式

上面代码自定义了log等级,时间输出格式,代码行和函数名。

总结

boost.log我觉得接口并不好用,有点太重了,太过度设计了。你想要很好的使用它就得学习它的那一套架构。功能上跟log4cpp,glog也没有优势。

看boost.log的未来的features TODO ,也不在点子上。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注