spdlog库中的sink_it_
时间: 2025-01-24 15:06:48 浏览: 44
### spdlog 库中的 `sink_it_` 功能解析
#### 功能作用
在 spdlog 日志库中,`sink_it_` 方法负责将日志消息传递给各个注册的日志接收器(sinks)。具体来说,在多 sink 的情况下,如 `dist_sink` 实现中,该方法会遍历所有已配置的 sink 对象,并调用它们各自的 `log()` 函数来实际记录日志信息[^1]。
对于每一个 sink,只有当其满足特定的日志级别过滤条件时才会执行真正的日志输出操作。这通过检查 `if (sink->should_log(msg.level))` 来完成,确保只发送符合条件的消息给相应的 sink 进行处理。
```cpp
void dist_sink::sink_it_(const details::log_msg &msg) override {
for (auto &sink : sinks_) {
if (sink->should_log(msg.level)) { // 只有匹配的日志等级才继续处理
sink->log(msg);
}
}
}
```
此设计允许灵活组合不同类型的 sinks 并控制哪些级别的日志应该被哪个 sink 接收并最终存储或显示出来。
#### 使用方法
为了利用 `sink_it_` 或者更广泛地说是为了设置多个不同的 sinks 到 logger 中去,可以按照如下方式:
1. 创建所需的 sink 类型实例,比如文件、标准输出等;
2. 构建一个复合 sink (`dist_sink`) 并向其中添加这些单独的 sink;
3. 将这个复合 sink 关联至某个具体的 logger 上面;
下面是一个简单的例子展示如何创建两个不同类型(console 和 file)的日志接收端并将它们绑定在一起工作:
```cpp
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"
// 初始化 console 和 file 两种形式的日志输出渠道
auto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
auto fileSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("myapp.log", true);
// 组合上述两者的分布式 sink
std::vector<spdlog::sink_ptr> combinedSinks{consoleSink, fileSink};
auto multiLogger = std::make_shared<spdlog::logger>("multi_logger", begin(combinedSinks), end(combinedSinks));
// 设置全局默认 logger
spdlog::set_default_logger(multiLogger);
// 开始记录日志...
LOG_INFO("This message will appear both on screen and in myapp.log");
```
这段代码展示了怎样有效地管理多种日志目的地以及如何让每条日志依据设定好的规则自动分发到合适的终端上。
阅读全文
相关推荐

















