如何转义 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 绘制文本背景?

如何使用 spdlog 记录 pid(进程 ID)

如何在代码中启用/禁用 spdlog 日志记录?

如何将 Windows 调试记录器附加到 spdlog

从动态加载的库中记录

spdlog 错误:“不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的 operator<<”