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 stored 在 sink
中的包装,而不是 logger
.
如果您确实需要此功能,只是想到了解决方法。
您可以 implement 您自己的 file_sink
,然后您可以拥有多个 formatter
。
struct log_msg
中有一个字段logger_name
,你可以用它来确定消息来自哪个记录器,并使用不同的格式化程序。请注意,如果您没有为记录器设置名称,则该字段为空字符串。
以下代码:
#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 stored 在 sink
中的包装,而不是 logger
.
如果您确实需要此功能,只是想到了解决方法。
您可以 implement 您自己的 file_sink
,然后您可以拥有多个 formatter
。
struct log_msg
中有一个字段logger_name
,你可以用它来确定消息来自哪个记录器,并使用不同的格式化程序。请注意,如果您没有为记录器设置名称,则该字段为空字符串。