2017-03-06 210 views
1

我使用Boost 1.63 VS2015升压日志过滤器在Windows 10如何配置在配置文件中

的代码如下Boost example

这是代码,看起来'severityLogger.open_record'生成的记录无效,它不会进入if语句中。

logging::core::get()->set_filter(
    logging::trivial::severity >= logging::trivial::info); 

这是我的配置文件:

#include <boost/format.hpp> 
#include <boost/locale/generator.hpp> 
#include <boost/log/core.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/utility/setup/file.hpp> 
#include <boost/log/utility/setup/from_settings.hpp> 
#include <boost/log/utility/setup/settings_parser.hpp> 
#include <boost/phoenix.hpp> 

namespace logging = boost::log; 
namespace expr = boost::log::expressions; 
namespace keywords = boost::log::keywords; 
namespace sinks = boost::log::sinks; 
namespace src = boost::log::sources; 

src::wseverity_logger<logging::trivial::severity_level> severityLogger; 
std::wifstream strm(L"config\\logger.ini"); 
strm.imbue(std::locale(strm.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>)); 
auto settings = logging::parse_settings(strm); 
logging::init_from_settings(settings); 
logging::add_common_attributes(); 

auto rec = severityLogger.open_record(keywords::severity = logging::trivial::severity_level::info); 
if (rec) { // Unable to go here !!! 
    logging::wrecord_ostream strm(rec); 
    strm << L"Some message"; 
    strm.flush(); 
    severityLogger_.push_record(boost::move(rec)); 
} 

但是,如果我添加了这段代码,它工作正常

[Core] 
DisableLogging=false 
Filter="%Severity% >= info" 

[Sinks.File] 
Destination=TextFile 
FileName="App_%Y-%m-%d.%N.log" 
Format="%TimeStamp% %Severity% - %Message%" 
AutoFlush=true 
TimeBasedRotation="00:00:00" 
RotationSize=10485760 

回答

1

的问题是,默认情况下,过滤器解析器不预计类型为logging::trivial::severity_level的属性。因此,解析的过滤器无法识别严重性级别并拒绝日志记录。

您需要通过注册过滤器工厂来指定属性值类型,如this部分所述。基本上,这需要为具有this部分中提及的值以外的任何属性进行。建议注册所有属性,甚至列出所有属性,否则库在处理过滤器时必须在缺省支持的所有类型上执行更昂贵的查找。

您可能还需要注册格式器工厂,类似于过滤器工厂。

+0

谢谢@Andrey,解决问题。 – user1633272

相关问题