0. spdlog简单介绍

spdlog 是一个快速的 C++ 日志库,只包含头文件,兼容 C++11。项目地址
特性:

  • 非常快
  • 只包含头文件
  • 无需依赖第三方库
  • 支持跨平台 - Linux / Windows on 32/64 bits
  • 支持多线程
  • 可对日志文件进行循环输出
  • 可每日生成日志文件
  • 支持控制台日志输出
  • 可选的异步日志
  • 支持日志输出级别
  • 可自定义日志格式
    (上述内容来源于 开源中国关于spdlog的介绍)

1. sinks

在spdlog中,sink指向实际的输出目标,例如

  1. stdout
  2. syslog(linux系统日志)
  3. ostream
  4. file
  5. ...
    代码路径: spdlog-master/include/spdlog/sinks

1.1 sink

class sink
{
public:sink(){_level = level::trace;}virtual ~sink() {}virtual void log(const details::log_msg& msg) = 0;virtual void flush() = 0;bool should_log(level::level_enum msg_level) const;void set_level(level::level_enum log_level);level::level_enum level() const;private:level_t _level;
};

sink类的两个纯虚函数 log flush 是子类需要实现的接口。

1.2 base_sink

没啥好说的直接上代码,这里仅列出主要内容。

template<class Mutex>
class base_sink:public sink
{
public://.....void log(const details::log_msg& msg) override{std::lock_guard<Mutex> lock(_mutex);_sink_it(msg);}protected:virtual void _sink_it(const details::log_msg& msg) = 0;Mutex _mutex;
};

模板类**base_sink继承sink,同时实现了log接口,通过Mutex决定类是工作在单线程
还是多线程下。而子类通过实现接口_sink_it输出日志。

在spdlog中,如果在多线程中base_sink形式如下:base_sink<std::mutex>;
单线程:base_sink<spdlog::details::null_mutex>;

而null_mutex什么都不做。

1.3 rotating_file_sink

通过文件饶接这个例子看下在spdlog中具体的sink是怎么实现的。

template<class Mutex>
class rotating_file_sink : public base_sink < Mutex >
{
public://......
protected:void _sink_it(const details::log_msg& msg) override{_current_size += msg.formatted.size();if (_current_size > _max_size){_rotate();_current_size = msg.formatted.size();}_file_helper.write(msg);}private://......void _rotate(){for (auto i = _max_files; i > 0; --i){// 修改文件名,转储文件//......}//......
};
typedef rotating_file_sink<std::mutex> rotating_file_sink_mt;
typedef rotating_file_sink<details::null_mutex>rotating_file_sink_st;

_sink_it实现了在文件超过限制后通过_rotate转储文件,同时使用文件进行输出。输出的对象是msg(
实际的日志内容)。
代码的最后两行分别定义了rotating_file_sink_mt和rotating_file_sink_st。前者使用在多线程中,
后者使用在单线程。其中的区别在1.2中已经说明。

转载于:https://www.cnblogs.com/eskylin/p/6483199.html

spdlog源码阅读 (1): sinks相关推荐

  1. 【游戏编程扯淡精粹】EASTL源码阅读

    [游戏编程扯淡精粹]EASTL源码阅读 侯捷先生在<漫谈程序员与编程> 中讲到 STL 运用的三个档次:"会用 STL,是一种档次.对 STL 原理有所了解,又是一个档次.追踪过 ...

  2. 应用监控CAT之cat-client源码阅读(一)

    CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...

  3. centos下将vim配置为强大的源码阅读器

    每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...

  4. 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

    该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...

  5. 源码阅读:SDWebImage(六)——SDWebImageCoderHelper

    该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...

  6. mybatis源码阅读

    说下mybatis执行一个sql语句的流程 执行语句,事务等SqlSession都交给了excutor,excutor又委托给statementHandler SimpleExecutor:每执行一次 ...

  7. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

  8. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  9. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

最新文章

  1. 深入浅出ES6(一):ES6是什么
  2. JavaScript实现使用 BACKTRACKING 方法查找集合的幂集算法
  3. VTK:可视化之Hanoi
  4. Open suse下 vi 语法加亮设置 显示
  5. c语言 srand time 0,c++ 随机数 srand(time(0)) 用法 | 求索阁
  6. 符江职高计算机教什么,高县符江职高具体地址
  7. 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值
  8. application.properties引用其他文件_企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)...
  9. Python 爬虫实战2 百度贴吧帖子
  10. ArcGIS Server中各种服务详解
  11. shell清空数据库表
  12. Visio2016 层次方框图
  13. 蓝桥杯python组——明码
  14. 通过代理实现权限控制
  15. 【IOS】iphone逻辑分辨率
  16. centos修改键盘布局
  17. 学生评语管理系统软件测试,学生评语管理系统测试版
  18. vue大屏展示 代码 从0 到1
  19. 第九章-项目人力资源管理
  20. setTimeout和for循环

热门文章

  1. linux ls没有反应_Linux入门②“命令格式”
  2. 学校计算机机房好处,浅谈学校计算机机房维护
  3. html中section与div,如何在html中的section标签内包含div标签
  4. 小型职工工作量c语言,计算机c语言职工工作量统计系统.doc
  5. mysql+dump+选项_mysqldump的几个主要选项探究
  6. python井字棋_用Python做一个井字棋小游戏
  7. 成人高考 计算机英语作文,2018年成人高考英语作文范文六篇
  8. Linux C/C++解析xls
  9. 缓存成神路:Redis读写分离难以理解?一文解析Redis读写分离技术
  10. 拥抱AI技术,赋能智慧工业