spdlog 源码解析

##记日志两种模式:

  1. 同步: 对于basic_file_sink, 日志每次调用fwrite写入到文件缓存,即使同步模式,也需要flush_every来定时flush,否则crash 时有丢失日志风险

  2. 异步:

  • log写日志就是把日志入一个循环queue。
  • 初始时会开启一个线程池,里面有n个线程,每个线程里做的工作就是从循环队列中取日志,写入到指定输出设备。当队列为空时,取不到数据时,会wait 10s时间,然后继续循环取数据。
  • 也需要flush_every来定时flush 数据

sink

sink 类实现多态,方便扩展.
对于继承的类,都是模板类

template<typename Mutex>
class base_sink : public sink
{}

Mutex 可以空实现,但是这样无法保证日志的连贯有序性,打日志的场景感觉实用性不大。但是是个很棒的设计方法。可以在其他场景运用这种设计方法。

可变模板参数

创建logger的代码

  1. 外面创建logger的api,是个模板函数
auto my_logger = spdlog::basic_logger_mt<spdlog::default_factory>("file_logger1", "logs/basic-log.txt");
auto my_logger = spdlog::basic_logger_mt("file_logger1", "logs/basic-log.txt");//使用了默认的模板default_factory

创建logger的函数模板, 模板有默认值default_factory

template<typename Factory = default_factory>
inline std::shared_ptr<logger> basic_logger_mt(const std::string &logger_name, const filename_t &filename, bool truncate = false)
{return Factory::template create<sinks::basic_file_sink_mt>(logger_name, filename, truncate);
}

其实可以写成
return Factory::create<sinks::basic_file_sink_mt>(logger_name, filename, truncate);
写成 Factory::template 这种形式还没太明白这是什么语法

第2步调用的create方法,此方法为可变模板参数。

using default_factory = synchronous_factory;
struct synchronous_factory
{template<typename Sink, typename... SinkArgs>static std::shared_ptr<spdlog::logger> create(std::string logger_name, SinkArgs &&... args){auto sink = std::make_shared<Sink>(std::forward<SinkArgs>(args)...);auto new_logger = std::make_shared<logger>(std::move(logger_name), std::move(sink));details::registry::instance().initialize_logger(new_logger);return new_logger;}
};

其中步骤2中 create<sinks::basic_file_sink_mt>(logger_name, filename, truncate) 中 sinks::basic_file_sink_mt 对应词函数模板中的模板参数Sink,入参logger_name对应此函数中的入参 std::string logger_name; 入参filename, truncate 对应此函数中的SinkArgs 可变模板参数

  1. 一个例子
void print()
{std::cout << "empty" << std::endl;
}//展开函数
template <class T, class ...Args>
void print(T head, Args... rest)
{std::cout << "parameter " << head << std::endl;print(rest...);
}

print(1, 2.2, 3, 4); 输出 1 2.2 3 4 empty
print(1, 2.2, 3, 4); 同上,参数T自动推导

如果把print中调用修改为print(rest…) 结果是什么样呢?这样就类型不会自动推导,所有入参 类型为int,输出2.2就会变为2

所以可变模板参数需要格外注意参数类型。

##periodic_worker

periodic_worker(const std::function<void()> &callback_fun, std::chrono::seconds interval){active_ = (interval > std::chrono::seconds::zero());if (!active_){return;}worker_thread_ = std::thread([this, callback_fun, interval]() {for (;;){std::unique_lock<std::mutex> lock(this->mutex_);if (this->cv_.wait_for(lock, interval, [this] { return !this->active_; })){return; // active_ == false, so exit this thread}callback_fun();}});}~periodic_worker(){if (worker_thread_.joinable()){{std::lock_guard<std::mutex> lock(mutex_);active_ = false;}cv_.notify_one();worker_thread_.join();}}

通过条件量实现timmer. 析构时重置标记位active_,然后notify.

spdlog 代码分析相关推荐

  1. 20145236《网络攻防》Exp4 恶意代码分析

    20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...

  2. C#中类的继承 override virtual new的作用以及代码分析

    继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...

  3. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用

    配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...

  4. lighttpd1.4.18代码分析

    lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态 posted @ 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1)  编辑 lig ...

  5. Device Tree(三):代码分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...

  6. 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!

    大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...

  7. 20145328 《网络对抗技术》恶意代码分析

    20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...

  8. starGAN原理代码分析

    下载: git clone https://github.com/yunjey/StarGAN.git 1 cd StarGAN/ 1 下载celebA训练数据: bash download.sh 1 ...

  9. tensorflow笔记:多层CNN代码分析

    tensorflow笔记系列:  (一) tensorflow笔记:流程,概念和简单代码注释  (二) tensorflow笔记:多层CNN代码分析  (三) tensorflow笔记:多层LSTM代 ...

最新文章

  1. 求高维方阵的绝对值最大特征值的方法:幂法(幂迭代)。
  2. mavne的依赖、继承、聚合
  3. 从Maven远程存储库下载
  4. 代码评审-如何保证缓存与数据库的读写一致性?
  5. 实验2-1-5 将x的平方赋值给y (5 分)
  6. 【福利派送】高质量AI书籍免费送给大家
  7. github上一些酷炫效果
  8. 强大新UI装逼神器微信小程序源码+多模板支持多种流量主模式
  9. Honeywell 1900 条码阅读器
  10. 洛谷试炼场 没了 不见了?
  11. 大学生计算机学科竞赛a类,全国大学生学科竞赛分类名单
  12. jquery动态创建表格
  13. bzoj1597 土地购买
  14. 杭州电子科技大学ACM-1001
  15. CH6202 黑暗城堡 最短路径生成树
  16. unique mapped reads
  17. putty怎么连到linux服务器,PuTTY 从 Windows 连接到 亚马逊服务器Linux 实例
  18. latex 两个表格并排放置
  19. 微信小程序网络字体安卓实机无法加载解决方案
  20. ntp网络时间服务器(网络时钟同步)客户端与服务器端设置方法说明

热门文章

  1. 1月16日服务器维护,【影之诗】1月16日服务器维护时卡片调整公告
  2. 直线检测——Radon变换/霍夫变换/基于快速傅里叶变换的直线检测
  3. Linux apache服务器(上)
  4. ios开发工具_7个基本的ios开发人员工具
  5. 推荐三款适合学生做笔记的软件
  6. 【电脑问题解决】戴尔游匣7559 16年 顶配 4k触摸屏 960m显卡 4k屏幕分辨率下使用卡顿(非使用4K分辨率进行游戏)
  7. 中国苹果树苗市场产量需求与投资收益预测报告2022-2028年
  8. trueNas/freebsd查看是否开启睿频
  9. 人工智能背后的“人工”: 数据标注时薪缩水一半,欠薪高发
  10. 通过java2dAPI绘制报表