如何转义 spdlog 消息?
Posted
技术标签:
【中文标题】如何转义 spdlog 消息?【英文标题】:How to escape spdlog message? 【发布时间】:2019-10-04 09:09:00 【问题描述】:我正在使用 spdlog 记录所有消息。我的日志模式是 JSON 格式。我在所有日志调用中手动转义消息。有没有办法在 spdlog 层自动转义消息?
手动转义示例:
spdlog::info(escape_message(data));
应该在spdlog层内自动处理:
spdlog::info(data);
【问题讨论】:
你能给出一些示例代码来展示“手动转义”的样子吗? @Eric 我已经更新了我的帖子。 【参考方案1】:告诉 spdlog 格式化单个字符串,而不是将字符串本身解释为格式字符串:
spdlog::info("", data);
【讨论】:
感谢您的回答,我试过了,但还是不行。结果如下:"message": "hi"hi"
。我通过std::cin
(hi"hi
) 获得了数据。
您是如何构建 JSON 的?听起来您正在寻找 json 转义,而不是 spdlog 转义。你能澄清你的问题吗?我的印象是 data
本身包含 json,而您在嵌入
字符时遇到了麻烦。
我的数据不是 JSON,实际上,我的 spdlog 模式是 JSON 格式。例如:"message": "%v"
。我的数据是一个字符串。
@mortezaipo:编辑你的问题会很好。你是对的,我的回答对你没有帮助。【参考方案2】:
我找到了解决办法。
我应该实现一个自定义的formatter
类,然后在format
方法中,我通过例如escape_message(msg.payload.data())
转义消息,然后在此方法中调用spdlog::log(msg.source, msg.level, escape_message(msg.payload.data()))
、spdlog::info
或...。
注意:在format
方法中我设置了一个日志模式,因为在类之外,如果我调用set_formatter
,然后调用set_pattern
,则效果不佳。
【讨论】:
如果你不得不用艰难的方式来做这件事......这里有一个简单的解释:github.com/gabime/spdlog/wiki/3.-Custom-formatting :-) @andreee 我完全遵循了那条路。但有一点定制以上是关于如何转义 spdlog 消息?的主要内容,如果未能解决你的问题,请参考以下文章
spdlog 错误:“不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的 operator<<”