2017-03-06 101 views
0
class SeverityLevelFormatter { 
private: 
    mutable boost::wformat format_; 

public: 
    SeverityLevelFormatter(const std::wstring& format) : format_(format) { 
    } 

    void operator() (logging::wformatting_ostream& strm, const logging::value_ref<logging::trivial::severity_level>& value) const { 
     strm << boost::wformat(format_) % to_string(value.get()); 
    } 
}; 

class ServerityFormatterFactory : public logging::basic_formatter_factory<wchar_t, logging::trivial::severity_level> { 
public: 
    formatter_type create_formatter(const logging::attribute_name& name, const args_map& args) { 
     auto it = args.find(L"format"); 
     if (it != args.end()) { 
      return boost::phoenix::bind(SeverityLevelFormatter(it->second), expr::stream, expr::attr<logging::trivial::severity_level>(name)); 
     } 
     else { 
      return expr::stream << expr::attr<logging::trivial::severity_level>(name); 
     } 
    } 
}; 


logging::register_formatter_factory(logging::aux::default_attribute_names::severity().string(), boost::make_shared<ServerityFormatterFactory>()); 

register_formatter_factory在这种情况下似乎不起作用。 但是,如果我使用基于ServerityFormatterFactory的'char',它就可以工作。Boost日志text_file_backend没有wchar_t版本?

我觉得这可能是因为在“升压/日志/片/ text_file_backend.hpp”中定义的text_file_backend不具有“wchar_t的”版本。

回答

0

要回答的标题你的问题,在Boost.Log文本文件汇没有wchar_t为基础实现(以及char16_tchar32_t为基础的),因为它们不与字符编码处理。不管应用程序使用的内部字符类型如何,接收器总是将字节写入日志文件。执行从内部字符串到字节的转换(即char s)是本地化的工作。

可以通过在接收器上调用imbue()来在基于每个接收器的基础上配置区域设置。它也可以通过在初始化Boost.Log之前调用std::locale::global()来全局设置。语言环境将用于提供给您设置的格式化程序的格式化流中。实际上,这意味着格式化程序将在需要时执行任何必需的字符代码转换。