boost 的 logging 库(二)

终于在 1.54 版本 logging 进入了 boost。其实不写 production code,很多东西平时很少用,logging、unit test 等等等等,最近 Java 写的比较多,C++ 这些方面却还不晓得一些基本的东西,其实了解一点对规范自己程序还是有一定的帮助的。Java 的世界里面 log4j 或者使用 facade 诸如 slf4j 都是很成熟的 logging library 了,由于每个 Java 文件都是一个类,通过将 logger 放在需要的类里面,logger 还有一个 tree structure,你可以通过 properties 设定 logger 使用的输出、输出的格式等等,这一切提供了 production level 的解决方案,boost.log 不知道是否能成为 C++ 里面的实际标准?前一篇写于 2011 年…

logging 的设计包括

  • source,这个 library 甚至不需要 logger 来写 log,这里的 source 指广义的行为
  • attributes 和 attribute value,可以是 global、thread specific 和 source specific,前两者是 core 负责的,在 application 代码里面不做修改
  • core 和 filtering,这部分将获得的数据打包,过滤(某些 sink 不需要某些类型的 record)
  • sink 这是实际输出 log 的对象,控制格式等

通常我们会偷懒使用 boost.log 提供的宏,简化 logger 调用,

  • 如 BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT 声明自己的全局 logger,然后通过 get 获得实际的 logger
  • 实际的 logger 通过 open_record 获得 record 对象,判定其是否为 true(可能配置时并没有给予 logger)
  • 如果为 true,可以调用 record_stream 构造用于输出 log 的 stream
  • 简化这个过程可以用 BOOST_LOG 宏

但实际上 boost.log 鼓励大家实现自己的 macro。boost.log 提供了 attribute 实现的扩展,除了默认的时间戳、线程 id 之外,不同的应用可以很容易定义自己的 attribute。boost.log 除了简单的 logger、带 severity filtering 的 logger,另外也有 channel logger(类似嵌入在类里面用类名当构造参数的 logger,但是 C++ 不能通过 reflection 拿到完整的类名),支持 exception 的 logger,以及混合这些功能的 logger,全局的 storage(比如记录 count 之类的使用)。总体来看这个 logging lib 看起来简单,可扩展,也许还需要一些很牛 x 的功能,诸如通过 macro 去掉编译时的 logging 代码。可能后面一些简单的程序考虑使用这个做 logging 了。

——————
And Laban gathered together all the men of the place, and made a feast.

Advertisements
boost 的 logging 库(二)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s