我有一个类似的代码:const auto jsonFormatter = boost::log::expressions::stream << boost::log::expressions::smessage;
我想使用nlohmann::json
来转义消息,如下所示:nlohmann::json json{boost::log::expressions::smessage};
我可以做以下转换boost::log::expressions::smessage
到std::string
:
std::stringstream ss;
ss << boost::log::expressions::smessage;
std::string message = ss.str();
nlohmann::json json{message};
,但我需要将其放入格式化程序中,因为const auto jsonFormatter = boost::log::expressions::stream << nlohmann::json{boost::log::expressions::smessage};
无法将boost::log::expressions::smessage
参数转换为任何nlohmann::json
构造函数。
有什么建议吗?
3条答案
按热度按时间ej83mcc01#
日志格式化程序看起来像普通的C++,但它们是表达式模板,组成执行相应操作的延迟可调用对象。
下面是如何创建一个知道如何执行此操作的 Package 器表达式:
现在你可以让你的格式化程序。
结果是,例如
现场演示
simpleLogger.h
simpleLogger.cpp
test.cpp
图纸
nfzehxib2#
除了sehe的答案之外,还可以使用Boost.Log组件实现类似JSON的格式,其中最重要的部分是
c_decor
字符装饰器,它确保其输出可以用作C样式的字符串文字。首先,
c_decor
将消息中的任何控制字符转义为C样式的转义序列,如\n、\t,还将转义双引号字符,然后添加括号和双引号以使输出与JSON格式兼容。如果您的日志消息中有非ASCII字符,并且您希望格式化的日志记录为严格的ASCII,则可以使用
c_ascii_decor
而不是c_decor
。除了c_decor
的功能外,它还将对任何大于127的字节进行转义,并将其转义为十六进制转义序列,例如\x8c。lp0sw83n3#
我真的很感谢帮助和其他答案,这可能是更好的在其他情况下,但长话短说,我尝试了很多解决方案,并与这一个在最后(我可以更新它,如果它可以改进):