2017-03-06 109 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()來全局設置。語言環境將用於提供給您設置的格式化程序的格式化流中。實際上,這意味着格式化程序將在需要時執行任何必需的字符代碼轉換。