SPDLOG_LOGGER_CALL 和 __VA_ARGS__ 在
SPDLOG_LOGGER_CALL and __VA_ARGS__ in
我想了解为什么我的可变参数在 spdlog
中不起作用。我知道有一个 SPDLOG_LOGGER_INFO
宏可以执行我的操作,但目前我需要了解 SPDLOG_LOGGER_CALL
是如何工作的。所以这是代码:
#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;
}
编译后得到如下输出
Aug 12 9:38:03 mymachine test: [2021-08-12 9:38:03.424] [logger] [info] [main.cpp:30] %d %s
但是我希望在输出中看到完整的消息,即
Aug 12 9:38:03 mymachine test: [2021-08-12 9:38:03.424] [logger] [info] [main.cpp:30] 10 my message
我觉得我错过了一些小而重要的东西。有人愿意帮忙吗?
SPDLOG_LOGGER_CALL()
只是 spdlog::logger::log()
的包装器,它不像您期望的那样使用 printf
样式的格式字符串。如果您在内部阅读 spdlog's documentation, you will see that spdlog uses the {fmt} 库:
Feature rich formatting, using the excellent fmt library.
其中有own syntax for format strings:
Format strings contain “replacement fields” surrounded by curly braces {}
. Anything that is not contained in braces is considered literal text, which is copied unchanged to the output.
这就是您在输出中看到 %d %s
的原因,因为它被视为文字文本。
的确,spdlog::logger::log()
ends up calling fmt::detail::vformat_to()
,按原样传递格式字符串和参数。
所以,尝试使用 "{} {}"
而不是 "%d %s"
:
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{} {}", i, msg);
或者:
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{:d} {:s}", i, msg);
我想了解为什么我的可变参数在 spdlog
中不起作用。我知道有一个 SPDLOG_LOGGER_INFO
宏可以执行我的操作,但目前我需要了解 SPDLOG_LOGGER_CALL
是如何工作的。所以这是代码:
#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;
}
编译后得到如下输出
Aug 12 9:38:03 mymachine test: [2021-08-12 9:38:03.424] [logger] [info] [main.cpp:30] %d %s
但是我希望在输出中看到完整的消息,即
Aug 12 9:38:03 mymachine test: [2021-08-12 9:38:03.424] [logger] [info] [main.cpp:30] 10 my message
我觉得我错过了一些小而重要的东西。有人愿意帮忙吗?
SPDLOG_LOGGER_CALL()
只是 spdlog::logger::log()
的包装器,它不像您期望的那样使用 printf
样式的格式字符串。如果您在内部阅读 spdlog's documentation, you will see that spdlog uses the {fmt} 库:
Feature rich formatting, using the excellent fmt library.
其中有own syntax for format strings:
Format strings contain “replacement fields” surrounded by curly braces
{}
. Anything that is not contained in braces is considered literal text, which is copied unchanged to the output.
这就是您在输出中看到 %d %s
的原因,因为它被视为文字文本。
的确,spdlog::logger::log()
ends up calling fmt::detail::vformat_to()
,按原样传递格式字符串和参数。
所以,尝试使用 "{} {}"
而不是 "%d %s"
:
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{} {}", i, msg);
或者:
SPDLOG_LOGGER_CALL(logger, spdlog::level::info, "{:d} {:s}", i, msg);