使用简单的severity_level来提升日志init_from_stream

时间:2018-04-15 22:49:19

标签: c++ boost

我正在尝试使用具有从流初始化功能的Boost日志库。 我这里有一些问题。我的代码很简单,基于Boost日志文档。

#include <boost/log/core.hpp>
#include <boost/log/utility/setup/from_stream.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/move/utility.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <iostream>
#include <fstream>

namespace logging  = boost::log;
namespace src      = boost::log::sources;
using namespace boost::log::trivial;

int main(int, char*[])
{        
   logging::add_common_attributes();

   logging::register_simple_filter_factory<logging::trivial::severity_level, char>("Severity");
   logging::register_simple_formatter_factory<logging::trivial::severity_level, char>("Severity");

   std::ifstream file("settings.ini");
   logging::init_from_stream(file);

   src::severity_logger<logging::trivial::severity_level> lg;

   BOOST_LOG_SEV(lg, error) << "test" << std::endl;

   return 0;
}

我的settings.ini文件也很简单,取自boost文档:

[Core]
DisableLogging=false
#Filter="%Severity% > 3"

# Sink settings sections
[Sinks.MySink1]

# Sink destination type
Destination=Console

# Sink-specific filter. Optional, by default no filter is applied.
#Filter="%Target% contains \"MySink1\""

# Formatter string. Optional, by default only log record message text is written.
Format="<%TimeStamp%> - %Severity% - %Message%"

# The flag shows whether the sink should be asynchronous
Asynchronous=false

# Enables automatic stream flush after each log record.
AutoFlush=true

请注意核心部分中带有“过滤器”的注释行。如果它被评论,那么一切都很完美。但是,当我取消注释时,我收到错误消息:

  

在抛出一个实例后终止调用   “增强:: exception_detail :: clone_impl

     
    

'what():错误的词法转换:源类型值无法解释为目标Aborted(core dumped)

  

我在论坛和Boost日志文档中读到,在调用init_from_stream函数之前,我应该注册filter和formatter工厂,甚至是类似boost :: log :: trivial :: severity_level的类型。而且我这样做。这有助于打印严重性(格式化),但没有帮助阅读Severity(解析)。 文档说也需要从istream读取Severity的函数,但是我检查它在trivial.hpp中是否存在于boost中,所以我想我不应该自己定义它。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

问题在于&#34; 3&#34;筛选字符串中的值不是logging::trivial::severity_level枚举的有效值。 Boost.Log为枚举提供operator>>,它需要以下字符串之一:&#34; trace&#34;,&#34; debug&#34;,&#34; info&#34;,& #34;警告&#34;,&#34;错误&#34;或者&#34;致命&#34;。每个字符串都转换为相同的命名枚举值。