spdlog:未使用相同的接收器正确配置记录器

spdlog: not configuring the logger correctly using same sink

以下代码:

#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"

int main() {
  auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  auto a = std::make_shared<spdlog::logger>("a", stdout_sink);
  auto b = std::make_shared<spdlog::logger>("b", stdout_sink);

  a->set_pattern("%v");
  b->set_pattern("debug %v");

  a->info("a");
  b->info("b");
}

产出

debug a
debug b

而不是

  a
 debug b

spdlogger 似乎只记得最后注册的模式。我如何实现预期的目标,因为有两个具有不同模式的记录器

试试这个:

#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/spdlog.h"

int main() {
  auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  auto stdout_sink_b = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  auto a = std::make_shared<spdlog::logger>("a", stdout_sink);
  auto b = std::make_shared<spdlog::logger>("b", stdout_sink_b);

  a->set_pattern("%v");
  b->set_pattern("debug %v");

  a->info("a");
  b->info("b");
}

输出为:

a
debug b

That would work yes. Problem is when you want to extend this to log files. Then, you end up having two log files

答案是不能,直接

set_formatter 只是 set_formatter(pattern_formatter{}). In spdlog, a formatter is storedsink 中的包装,而不是 logger.


如果您确实需要此功能,只是想到了解决方法。

您可以 implement 您自己的 file_sink,然后您可以拥有多个 formatter

struct log_msg中有一个字段logger_name,你可以用它来确定消息来自哪个记录器,并使用不同的格式化程序。请注意,如果您没有为记录器设置名称,则该字段为空字符串。