前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sinkable_paas容器

sinkable_paas容器

作者头像
全栈程序员站长
发布2022-11-01 14:52:34
7800
发布2022-11-01 14:52:34
举报
文章被收录于专栏:全栈程序员必看

Sinks

代码语言:javascript
复制
sink是将日志写入实际目标的对象。每一个sink只对应一个写入的目标对象(e.g file、console或db), 并且独立的拥有自己的formatter对象,用于日志格式配置。

spdlog的logger使用一个vector保存多个用智能指针维护的sink(e.g std::shared_ptr<sink>,表示当前logger的多个日志输出目标sink。当使用logger记录一条日志时,将调用每个sink对象的函数sink(log_msg)。

 spdlog的sink具有_mt(多线程)或_st(单线程)后缀,以指示线程安全。虽然单线程sink不能同时被多个线程使用,因为没有使用线程锁,所以单线程的sink速度更快。

1. 可用Sink列表

名称

头文件

android_sink

android_sink.h

ansicolor_sink

ansicolor_sink-inl.h ansicolor_sink.h

base_sink

base_sink-inl.h base_sink.h

base_file_sink

base_file_sink-inl.h base_file_sink.h

daily_file_sink

daily_file_sink.h

dist_sink

dist_sink.h

dup_filter_sink

dup_filter_sink.h

hourly_file_sink

hourly_file_sink.h

mongo_file_sink

mongo_file_sink.h

msvc_sink

msvc_sink.h

null_sink

null_sink.h

ostream_sink

ostream_sink.h

qt_sinks

qt_sinks.h

ringbuffer_sink

ringbuffer_sink.h

rotating_file_sink

rotating_file_sink-inl.h rotating_file_sink.h

stdout_color_sinks

stdout_color_sinks-inl.h stdout_color_sinks.h

stdout_sinks

stdout_sinks-inl.h stdout_sinks.h

syslog_sink

syslog_sink.h

systemd_sink

systemd_sink.h

tcp_sink

tcp_sink.h

udp_sink

udp_sink.h

win_eventlog_sink

win_eventlog_sink.h

wincolor_sink

wincolor_sink-inl.h wincolor_sink.h

2.创建sinks

2.1 rotating_file_sink

滚动式日志生成,当一个文件达到约定大小后将创建一个新的log文件继续写入,知道日志文件数目达到用户指定的最大数量。log文件大小和可以在spdlog::rotating_logger_mt构造函数中配置

代码语言:javascript
复制
// create a thread safe sink which will keep its file size to a maximum of 5MB and a maximum of 3 rotated files.
#include "spdlog/sinks/rotating_file_sink.h"
...
auto file_logger = spdlog::rotating_logger_mt("file_logger", "logs/mylogfile", 1048576 * 5, 3);

或者先创建一个sink,再传递给一个logger

代码语言:javascript
复制
#include "spdlog/sinks/rotating_file_sink.h"
...
auto rotating = make_shared<spdlog::sinks::rotating_file_sink_mt> ("log_filename", 1024*1024, 5, false);
auto file_logger = make_shared<spdlog::logger>("my_logger", rotating);

2.2 daily_file_sink

指定一个时间,spdlog会在每天指定时间点创建一个新的log文件,以时间戳作为文件名的结尾。

代码语言:javascript
复制
#include "spdlog/sinks/daily_file_sink.h"
..
auto daily_logger = spdlog::daily_logger_mt("daily_logger", "logs/daily", 14, 55);

以上使用线程安全的sink,在每天的14:55分创建新log文件。

2.3 simple_file_sink

一个简单的文件sink,只需要给定写入的log文件,而没有任何限制

代码语言:javascript
复制
#include "spdlog/sinks/basic_file_sink.h"
...
auto logger = spdlog::basic_logger_mt("mylogger", "log.txt");

2.4 stdout_sink/stderr_sink

创建标准输出和标准错误sink,区分是否带有颜色属性

2.4.1 no color
代码语言:javascript
复制
#include "spdlog/sinks/stdout_sinks.h"
...
auto console = spdlog::stdout_logger_mt("console");
auto err_console = spdlog::stderr_logger_st("console");
2.4.2 with color
代码语言:javascript
复制
#include "spdlog/sinks/stdout_color_sinks.h"
...
auto console = spdlog::stdout_color_mt("console");
auto err_console = spdlog::stderr_color_st("console");

或直接创建一个sink

代码语言:javascript
复制
auto sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();

2.5 ostream_sink

代码语言:javascript
复制
#include "spdlog/sinks/ostream_sink.h "
...
std::ostringstream oss;
auto ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_mt> (oss);
auto logger = std::make_shared<spdlog::logger>("my_logger", ostream_sink);

2.6 null_sink

null_sink作为一个空的接收器,不会记录log内容,可以用于调试或者作为一个参考实现

代码语言:javascript
复制
#include "spdlog/sinks/null_sink.h"
...
auto logger = spdlog::create<spdlog::sinks::null_sink_st>("null_logger");

2.7 syslog_sink

POSIX syslog(3) 将log发送到系统调用syslog()函数

代码语言:javascript
复制
#include "spdlog/sinks/syslog_sink.h"
...
spdlog::syslog_logger logger("logger_name", "my_ident");

2.8 systemd_sink

将log发送到系统调用 systemd()

代码语言:javascript
复制
#include "spdlog/sinks/systemd_sink.h"
...
auto systemd_sink = std::make_shared<spdlog::sinks::systemd_sink_st>();
spdlog::logger logger("logger_name", systemd_sink);

2.9 dist_sink

将日志消息分发到其他接收器的列表

代码语言:javascript
复制
#include "spdlog/sinks/dist_sink.h"

...
auto dist_sink = make_shared<spdlog::sinks::dist_sink_st>();
auto sink1 = make_shared<spdlog::sinks::stdout_sink_st>();
auto sink2 = make_shared<spdlog::sinks::simple_file_sink_st>("mylog.log");

dist_sink->add_sink(sink1);
dist_sink->add_sink(sink2);

2.10 msvc_sink

Windows debug sink(使用 OutputDebugStringA 进行日志记录)

代码语言:javascript
复制
#include "spdlog/sinks/msvc_sink.h"
auto sink = std::make_shared<spdlog::sinks::msvc_sink_mt>();
auto logger = std::make_shared<spdlog::logger>("msvc_logger", sink);

2.11 dup_filter_sink

这是去除连续重复日志的sink, 如果前一条消息相同且未设置“max_skip_duration”,则跳过该消息。

代码语言:javascript
复制
#include "spdlog/sinks/dup_filter_sink.h"
auto dup_filter = std::make_shared<dup_filter_sink_st>(std::chrono::seconds(5));
dup_filter->add_sink(std::make_shared<stdout_color_sink_mt>());
spdlog::logger l("logger", dup_filter);
l.info("Hello");
l.info("Hello");
l.info("Hello");
l.info("Different Hello");

结果

代码语言:javascript
复制
[2019-06-25 17:50:56.511] [logger] [info] Hello
[2019-06-25 17:50:56.512] [logger] [info] Skipped 3 duplicate messages..
[2019-06-25 17:50:56.512] [logger] [info] Different Hello

2.12 ringbuffer_sink

ringbuffer_sink将最新的日志消息保存在内存中。检索日志消息可以调用:spdlog::sinks::ringbuffer_sink::last_formatted(size_t)

代码语言:javascript
复制
#include "spdlog/sinks/ringbuffer_sink.h"
auto ringbuffer_sink = std::make_shared<spdlog::sinks::ringbuffer_sink_mt>(128);
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(std::make_shared<spdlog::sinks::basic_file_sink_mt>("path/to/log.txt"));
sinks.push_back(ringbuffer_sink);
auto logger = std::make_shared<spdlog::logger>("logger_name", std::begin(sinks), std::end(sinks));
for (int i = 0; i < 256; ++i) { 

logger->info("Log message {}", i);
}
// Retrieve all log messages. `log_message` contains 128 messages.
std::vector<std::string> log_messages = ringbuffer_sink->last_formatted();
// Retrieve a maximum of 64 log messages.
std::vector<std::string> log_messages = ringbuffer_sink->last_formatted(64);

3. 创建自己的sink

想要实现客制化的sink,需要实现一个简单的sink接口。

一个实现方式时继承一个base_sink类。 这个类已经是处理了线程锁,可以非常容易的实现线程安全的sink。

这 这里例子中,只需要取实现两个protected成员函数sink_it_(...)flush(...)

代码语言:javascript
复制
#include "spdlog/sinks/base_sink.h"
template<typename Mutex>
class my_sink : public spdlog::sinks::base_sink <Mutex>
{ 

...
protected:
void sink_it_(const spdlog::details::log_msg& msg) override
{ 

// log_msg is a struct containing the log entry info like level, timestamp, thread id etc.
// msg.raw contains pre formatted log
// If needed (very likely but not mandatory), the sink formats the message before sending it to its final destination:
spdlog::memory_buf_t formatted;
spdlog::sinks::base_sink<Mutex>::formatter_->format(msg, formatted);
std::cout << fmt::to_string(formatted);
}
void flush_() override 
{ 

std::cout << std::flush;
}
};
#include "spdlog/details/null_mutex.h"
#include <mutex>
using my_sink_mt = my_sink<std::mutex>;
using my_sink_st = my_sink<spdlog::details::null_mutex>;

4. 将sinks手动添加到创建的logger中

在v1.x版本的spdlog中,函数spdlog::logger::sinks()返回一个sings向量的非常量引用。允许我们手动的将创建的sink push back进去。 但是sinks vector没有mutex保护,所以不是线程安全的,需要小心使用。详见:thread_safety

spdlog::logger::sinks()定义:

代码语言:javascript
复制
inline std::vector<spdlog::sink_ptr> &spdlog::logger::sinks()
{ 

return sinks_;
}

应用:

代码语言:javascript
复制
spdlog::get("myExistingLogger")->sinks().push_back(myNewSink);

原文链接:https://github.com/gabime/spdlog/wiki/4.-Sinks

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200393.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Sinks
    • 1. 可用Sink列表
      • 2.创建sinks
        • 2.1 rotating_file_sink
        • 2.2 daily_file_sink
        • 2.3 simple_file_sink
        • 2.4 stdout_sink/stderr_sink
        • 2.5 ostream_sink
        • 2.6 null_sink
        • 2.7 syslog_sink
        • 2.8 systemd_sink
        • 2.9 dist_sink
        • 2.10 msvc_sink
        • 2.11 dup_filter_sink
        • 2.12 ringbuffer_sink
      • 3. 创建自己的sink
        • 4. 将sinks手动添加到创建的logger中
        相关产品与服务
        日志服务
        日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档