提升日志记录text_file_backend没有wchar_t版本?

时间:2017-03-06 18:16:56

标签: c++ boost boost-log

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似乎不起作用。 但是,如果我使用基于“ char ”的ServerityFormatterFactory,它就可以工作。

我发现这可能是因为'boost / log / sinks / text_file_backend.hpp'中定义的text_file_backend没有' wchar_t '版本。

1 个答案:

答案 0 :(得分:0)

要回答标题中的问题,Boost.Log中的文本文件汇没有基于wchar_t的实现(以及基于char16_tchar32_t的实现),因为他们不处理字符编码。无论应用程序使用何种内部字符类型,接收器始终将字节写入日志文件。从内部字符串到字节(即char s)执行转换是语言环境的工作。

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