我正在尝试使用具有从流初始化功能的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中,所以我想我不应该自己定义它。
我在这里缺少什么?
答案 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;。每个字符串都转换为相同的命名枚举值。