【问题标题】:Boost Log Callback提升日志回调
【发布时间】:2013-07-05 14:45:53
【问题描述】:

我创建了一个基于Boost Log的记录器机制。

我的代码基于example 中所示的琐碎记录器。

我想知道如何自动调用系统退出

exit(1)

(或任何其他自定义回调函数)每当发生致命错误时。

欢迎任何帮助!

更新:

解决办法是通过重载consume()方法来extend the backend sink

【问题讨论】:

  • 你可以自己写boost::log sink。但是日志记录和错误处理是不同的问题,您可能不应该将它们混为一谈。此外,调用exit() 是终止C++ 程序的一种不优雅的方式,因为RAII 对象不会被释放。当您遇到致命情况时,记录它并抛出异常有什么问题?
  • 你说得对,我确实有我的自定义接收器,exit(1) 并不优雅。它只是在我的脑海中发生/实现LOG(FATAL) 作为进程终止异常,我认为它们可以“统一”。

标签: boost boost-log


【解决方案1】:

检查普通记录器严重性级别的接收器示例:

#include <boost/log/trivial.hpp>
#include <boost/log/sinks/basic_sink_backend.hpp>
#include <boost/log/attributes/value_extraction.hpp>
#include <boost/log/sinks/async_frontend.hpp>
namespace sinks = boost::log::sinks;

void initBoostLog() {
  struct Sink: public sinks::basic_formatted_sink_backend<char, sinks::concurrent_feeding> {
    void consume (const boost::log::record_view& rec, const string& str) {
      using boost::log::trivial::severity_level;
      auto severity = rec.attribute_values()[boost::log::aux::default_attribute_names::severity()].extract<severity_level>();
      if (!severity || severity.get() <= severity_level::info) {
        std::cout << str << std::endl;
      } else {
        std::cerr << str << std::endl;
      }
    }
  };

  typedef sinks::asynchronous_sink<Sink> sink_t; boost::shared_ptr<sink_t> sink (new sink_t());
  boost::shared_ptr<boost::log::core> logc = boost::log::core::get();
  logc->add_sink (sink);
}

【讨论】:

  • consume() 会自动调用吗?因为它似乎没有这样做。它编译显示警告,即 paren boost 方法现在已被隐藏。我不确定我使用同步接收器这一事实是否重要。
猜你喜欢
  • 2013-08-03
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多