【发布时间】:2021-07-27 17:47:26
【问题描述】:
我想知道是否有任何方法可以确保不构造日志行中定义的消息。在某些情况下,我会添加带有“跟踪”严重性的日志记录,但我担心无论如何都会构建消息(无论严重性是高还是低)。让我们考虑以下简化的日志记录系统:
template<class... Msg>
void logMessage(LogLevel logLevel, Msg... msg) {
if (logLevel == LogLevel::Info) {
auto test = fmt::format(std::forward<Msg>(msg)...);
}
}
通过客户端调用:
logMessage(LogLevel::Info, "this is sample message: {}", 123);
据我所知,即使日志级别不等于“信息”,也无法保证编译器会对此进行优化。因此,不能保证“这是示例消息:{}”字符串不会被构造为临时的右值变量。 实现目标的唯一方法是:
template<class... Msg>
void logMessage(Msg... msg) {
auto test = fmt::format(std::forward<Msg>(msg)...);
}
但是每个客户端调用看起来像这样:
LogLevel level = LogLevel::Info;
if (level == LogLevel::Debug) {
logMessage("this is sample message: {}", 123);
}
我想知道是否有任何巧妙的宏使用方法或 constexpr 来获得干净的单行日志记录 API,同时确保当严重性较低时甚至不构造参数? (仍然需要在运行时配置严重性)
【问题讨论】:
-
"this is sample message: {}"只是一个字符串文字,没有字符串是“构造的”