首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPDLOG_LOGGER_CALL和__VA_ARGS__

SPDLOG_LOGGER_CALL和__VA_ARGS__
EN

Stack Overflow用户
提问于 2021-08-12 18:54:27
回答 1查看 522关注 0票数 0

我正试图理解为什么我的各种论点在spdlog中不起作用。我知道有一个SPDLOG_LOGGER_INFO宏可以做我所做的事情,但是现在我需要了解SPDLOG_LOGGER_CALL是如何工作的。下面是代码:

代码语言:javascript
复制
#include <iostream>
#include <spdlog/sinks/syslog_sink.h>
#include <spdlog/spdlog.h>
#include <memory>
#include <syslog.h>

int main()
{
    auto logger = std::make_shared<spdlog::logger>(
            "logger", 
            std::make_shared<spdlog::sinks::syslog_sink_mt>(
                "", LOG_ODELAY, LOG_USER, true));
    std::string msg = "my message";
    int i = 10;
    SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "%d %s", i, msg);
    return 0;
}

编译之后,我得到以下输出

代码语言:javascript
复制
Aug 12 9:38:03 mymachine test: [2021-08-12 9:38:03.424] [logger] [info] [main.cpp:30] %d %s

但是,我希望在输出中看到一个完整的消息,即

代码语言:javascript
复制
Aug 12 9:38:03 mymachine test: [2021-08-12 9:38:03.424] [logger] [info] [main.cpp:30] 10 my message

我觉得我错过了一些小但重要的东西。有人愿意帮忙吗?

调用定义

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-12 19:10:04

SPDLOG_LOGGER_CALL()只是spdlog::logger::log()的包装器,它不像您期望的那样使用printf-style格式字符串。如果您阅读spdlog文档,您将看到spdlog在内部使用{fmt}库:

功能丰富的格式,使用优秀的fmt库。

它有它的格式字符串的自己的语法

格式字符串包含由大括号{}包围的“替换字段”。不包含在大括号中的任何内容都被认为是文字文本,它被复制到输出中。

这就是为什么在输出中看到%d %s,因为它被视为文字文本。

实际上,spdlog::logger::log() 最后打电话 fmt::detail::vformat_to()把格式字符串和参数按原样传递给它。

所以,尝试使用"{} {}"而不是"%d %s"

代码语言:javascript
复制
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{} {}", i, msg);

另一种选择是:

代码语言:javascript
复制
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{:d} {:s}", i, msg);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68762824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档