码迷,mamicode.com
首页 > 其他好文 > 详细

boost.log(三)接收器

时间:2015-05-07 12:20:30      阅读:461      评论:0      收藏:0      [点我收藏+]

标签:

设置接收器

    BOOST_LOG_TRIVIAL不能提供足够的灵活性。例如,有时可能需要更复杂的逻辑来处理日志,而不是简单地将其打印在控制台上。为了定制这一点,你必须构造记录接收器,并在boost.log库core里面注册。这通常只需要你在应用程序启动的地方注册一次就够了。

【注意】在前面的章节中我们没有初始化任何的接收器,因为boost.log库在没有初始化任何接收器的情况下会使用一个默认的接收器,这就是为什么我们能够在控制台中看到日志的输出结果。如果你设置了自定义的接收器,那么默认的接收器将会失效,虽然你仍然可以使用BOOST_LOG_TRIVIAL来记录日志。

文件记录

下面将演示如何将记录写入到文件中:
  1. #include <iostream>
  2. #include <boost/log/core.hpp>
  3. #include <boost/log/trivial.hpp>
  4. #include <boost/log/expressions.hpp>
  5. #include <boost/log/utility/setup/file.hpp>
  6. void init()
  7. {
  8. boost::log::add_file_log("sample.log");
  9. boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::info);
  10. }
    添加的代码片断是对 add_file_log 函数的调用。顾名思义,该函数初始化一个将日志记录存储到文本文件的接收器。该函数还接受了大量的自定义选项,例如文件大小限制。举个例子:
  1. #include <iostream>
  2. #include <boost/log/core.hpp>
  3. #include <boost/log/trivial.hpp>
  4. #include <boost/log/expressions.hpp>
  5. #include <boost/log/utility/setup/file.hpp>
  6. void init()
  7. {
  8. boost::log::add_file_log(
  9. boost::log::keywords::file_name = "sample_%N.log",
  10. boost::log::keywords::rotation_size = 10 * 1024 * 1024,
  11. boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
  12. boost::log::keywords::format = "[%TimeStamp%]: %Message%"
  13. );
  14. boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::info);
  15. }

下面介绍一下add_file_log函数的参数列表:
  • 参数1:文件名模板
  • 参数2:超过此文件大小自动建立新文件
  • 参数3:超过此时间自动建立新文件
  • 参数4:日志记录格式
【注意】你可以注册多个接收器,每个接收器将接收并处理日志记录

深入接收器

在最简单的形式中,对以上代码中的 add_file_log 函数的调用是几乎等同于此:
  1. #include <fstream>
  2. #include <boost/log/core.hpp>
  3. #include <boost/smart_ptr.hpp>
  4. #include <boost/log/trivial.hpp>
  5. #include <boost/log/sinks/sync_frontend.hpp>
  6. #include <boost/log/sources/record_ostream.hpp>
  7. #include <boost/log/sinks/text_ostream_backend.hpp>
  8. void init()
  9. {
  10. // 构造接收器
  11. typedef boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend > text_sink;
  12. boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
  13. // 添加一个流写入日志
  14. sink->locked_backend()->add_stream(boost::make_shared< std::ofstream >("sample.log"));
  15. // 注册接收器
  16. boost::log::core::get()->add_sink(sink);
  17. }

    你可能已经注意到了接收器是由两个类组成:frontend  和 backend  。 frontend (上述片段中的boost::log::sinks::synchronous_sink模板类) 负责所有接收器常见各种任务,如线程同步模型、 过滤和基于文本的接收器,格式。 backend 上述片段中的boost::log::sinks::text_ostream_backend) 实现接收器所有具体的功能,如在这种情况下写入一个文件。log库提供大量的 frontend   backend  ,它们是现成的,可以彼此一起组合使用。

    boost::log::sinks::synchronous_sink 表示接收器是同步的,它允许多个线程在争用的情况下写入日志。这意味着后端 boost::log::sinks::text_ostream_backend不必担心多线程问题。

    boost::log::sinks::text_ostream_backend 类写入格式化日志记录到 STL 兼容的流。上面我们使用了一个文件流,但是我们也可以使用一个任何类型的流。例如,添加到控制台输出:
  1. #include <boost/log/core.hpp>
  2. #include <boost/smart_ptr.hpp>
  3. #include <boost/log/trivial.hpp>
  4. #include <boost/core/null_deleter.hpp>
  5. #include <boost/log/sinks/sync_frontend.hpp>
  6. #include <boost/log/sinks/text_ostream_backend.hpp>
  7. void init()
  8. {
  9. // 构造接收器
  10. typedef boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend > text_sink;
  11. boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
  12. // 添加一个流写入日志
  13. boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter());
  14. sink->locked_backend()->add_stream(stream);
  15. // 注册接收器
  16. boost::log::core::get()->add_sink(sink);
  17. }
    boost::log::sinks::text_ostream_backend支持添加多个流,这这种情况下,其输出将被赋值到所有加入的流之中。所有它可以同时在控制台或者是文件中输出结果。如果开启了过滤,那么boost.log库只会在记录没有被过滤掉的日志时才会产生开销。

【注意】注册几个不同接收器与多个目标流注册到一个接收器的区别。前者允许独立定制每个接收器的输出后者如果不需要这样的定制将工作相当快,此特性是特定于这个特定的 backend  

    boost.log库通过提供一系列的 backend  ,来提供不同的日志处理的逻辑。例如,通过指定系统日志backend  可以网络日志记录把发送到日志服务器,或通过设置Windows NT事件日志backend  可以使用Windows应用程序的运行时监控工具,使应用程序运行时发出的日志记录

    最后要说的调用成员函数 locked_backend() 访问接收器backend 它被所有接收器的frontend 提供,用于获取backend 线程安全访问函数返回一个backend 智能指针,并且它存在一个backend  (这意味着如果另一个线程此时将日志记录传递接收器,它将被阻塞直到释放backend 后)。唯一例外 unlocked_sink类型的frontend 根本同步,只是返回一个解锁backend指针

关于接收器的更多信息:

boost.log(三)接收器

标签:

原文地址:http://www.cnblogs.com/zhangpanyi/p/4484281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!