2017-10-12 56 views
0

查看boost/log/sources/basic_logger.hpp头文件,basic_logger :: open_record_unlocked忽略了basic_composite_logger传递的参数。boost :: log :: sources :: basic_logger :: open_record_unlocked忽略参数

template< typename ArgsT > 
record open_record_unlocked(ArgsT const&) 
{ 
    return m_pCore->open_record(m_Attributes); 
} 

当我穿过BOOST_LOG_WITH_PARAMETERS属性的属性永远不会进入过滤器或水槽。

图书馆如此重要的事情如此错误?这怎么不会发生在每个人身上?显然,我在这里做错了什么,但Boost代码是有罪的。这里是我的代码片段:

mylog.hpp

namespace Log 
{ 

enum Severity 
{ 
    SPAM, 
    TRACE, 
    VERBOSE, 
    DEBUG, 
    INFO, 
    WARNING, 
    ERROR, 
    FATAL 
}; 

namespace Attr 
{ 

BOOST_PARAMETER_KEYWORD(Tag, Severity); 
BOOST_PARAMETER_KEYWORD(Tag, Component); 

} // namespace Attr 

} // namespace Log 

mylog.cpp

namespace SomeCode 
{ 

namespace attr 
{ 

BOOST_LOG_ATTRIBUTE_KEYWORD(severity, Log::Attr::Tag::Severity::keyword_name(), Log::Severity); 
BOOST_LOG_ATTRIBUTE_KEYWORD(component, Log::Attr::Tag::Component::keyword_name(), std::string); 

} // namespace attr 

class Foo 
{ 
public: 
    Foo(const std::string& component) 
    { 
     m_Logger.add_attribute(attr::component.get_name(), boost::log::attributes::constant<attr::tag::component::value_type>(component)); 
    } 

    void bar() 
    { 
     BOOST_LOG_WITH_PARAMS(m_Logger, (Log::Attr::Severity = Log::INFO)) << "Test"; 
    } 

private: 
    boost::log::sources::logger_mt m_Logger; 
}; 

} // namespace SomeCode 

int main() 
{ 
    SomeCode::Foo foo("main"); 
    foo.bar(); 
    return (0); 
} 

日志显示我的组件属性,但不严重,而且它也没有提供给过滤器。

回答

0

您传递给BOOST_LOG_STREAM_WITH_PARAMS的参数是而不是属性。这些是由logger features接收和使用的命名参数。每个这样的参数都有一个特定的含义,这个特定的功能需要它。例如,severity logger feature接受severity参数,该参数将其解释为日志记录的严重性级别。 BOOST_LOG_SEV宏在内部处理命名参数,因此您不必为此使用BOOST_LOG_STREAM_WITH_PARAMS

你的榜样应该是这个样子:

BOOST_LOG_ATTRIBUTE_KEYWORD(a_severity, "Severity", Log::Severity); 
BOOST_LOG_ATTRIBUTE_KEYWORD(a_component, "Component", std::string); 

namespace SomeCode 
{ 

class Foo 
{ 
public: 
    Foo(const std::string& component) 
    { 
     m_Logger.add_attribute(a_component.get_name(), 
      boost::log::attributes::constant<tag::a_component::value_type>(component)); 
    } 

    void bar() 
    { 
     BOOST_LOG_SEV(m_Logger, Log::INFO) << "Test"; 

     // Or, equivalently: 
     BOOST_LOG_STREAM_WITH_PARAMS(m_Logger, (boost::log::keywords::severity = Log::INFO)) << "Test"; 
    } 

private: 
    boost::log::sources::severity_logger_mt<Log::Severity> m_Logger; 
}; 

} // namespace SomeCode 

请注意,您不需要BOOST_PARAMETER_KEYWORD声明。记录器期望的命名参数是severity,与属性值类型无关,并且参数关键字已由库声明。

+0

谢谢。 open_record函数没有完全采用属性并不明显。这使我绊倒了。 – k001daddy