源码:https://gitee.com/honortech/log-system
日志落地类(工厂模式)
Sink.hpp
简单工厂模式构造日志的落地方式,内置三种落地方式,标准输出、指定文件、按大小滚动文件,简单工厂模式也方便扩展更多的落地方式
双缓冲区异步处理器

缓冲区
- 维护一个字符数组,和标记可读可写位置的指针,
- Buffer.hpp
异步工作器
Looper.hpp
- 维护两个缓冲区,分别为生产者缓冲区和消费者缓冲区,
- 生产者缓冲区对应的方法为 Push,将日志消息拷贝到缓冲区中,
- 消费者缓冲区由线程操作,对应的方法为构造异步日志器时传入的回调方法,也就是异步日志器的 RealLog 方法,也即完成日志的实际落地
- 互斥锁保证缓冲区访问的线程安全,信号量保证两缓冲区之间的通知机制,以便适时进- 行交换来进行数据处理和接收新的数据
- 异步工作器的停止方法,停止时注意唤醒日志处理线程,并回收线程
日志器类
Logger.hpp
各等级日志消息输出策略,实际落地接口还是由子类重写实现
同步日志器
class SyncLogger : public Logger
直接进行日志落地
异步日志器
class AsyncLogger : public Logger
将日志消息交给缓冲区,将实际落地方法传递给异步工作器
构造日志器
class LoggerBuilder
基类接口构造各组件及属性
是否开启非安全模式(动态扩容),日志器类型,日志器名称,日志限制等级,日志消息格式器,日志落地方式
构造局部日志器
局部日志器只能够局部使用,出作用域就销毁了,不能很好的利用资源
构造全局日志器
将构造的全局日志器交给一个全局的单例管理器,就能够一直存在,随取随用,更好地利用了资源
日志器管理器(单例模式)
- 把创建出的日志器交给一个日志器管理器进行管理,并且使用单例模式,使得全局只有一个日志器管理器
- 在创建第一个全局日志器的时候就同时创建了一个日志器管理器单例,即全局日志器的 Build 接口(根据基类接口构造出的各组件和属性,实际创建出一个全局日志器,同时创建管理器单例,将其添加到这个管理器单例中)
- 此后可以随时通过管理器访问创建好的日志器,也可随时创建并添加新的日志器
日志宏&全局接口(代理模式)
使用代理模式,定义宏和全局接口以简化用户操作
笔记
一、项目笔记,日志系统,9_26-9_27-10_2
1. enum class (c++11),空间域,类型转换
2. access() (linux), fstat() (POSIX, linux&windows),平台可移植
3. # 与 ##
4. payload 有效载荷
5. 纯虚函数与 override,重写的虚函数都加上override
6. localtime_r(), strftime() 时间相关函数
7. gdb调试: -g 编译,gdb ./test 开始调试,break Util.hpp:38 指定处断点,run 跳到断点,n 逐条代码调试,p parameter 监视变量,quit 结束调试
二、Sink.hpp
8. 基类里抽象基类指针方便访问,using ptr = std::shared_ptr<LogSink>
9. virtual ~Sink( ){ }; // 方便子类回收和扩展
10. FIleSink,通过文件句柄进行操作,ofstream,
11. RollSinkBySize,basename
12. 滚动文件时,要先close原文件句柄,避免资源泄露
13. 不定参数是针对函数的,作为模板参数只能用于生成模板函数
14. 扩展:以时间进行文件滚动的日志系统落地模块
三、Logger.hpp
四、建造者模式
五、异步缓冲区(双缓冲区异步处理器)
1. 线程安全缓冲区(队列,避免空间频繁申请释放 --> 环形队列,循环利用空间) + 异步工作线程负责将缓冲区中日志消息落地
2. 保证缓冲区操作的线程安全 --> 加锁,会有锁冲突
3. 双缓冲区(写入缓冲区,处理缓冲区),降低了生产者与消费者间的锁冲突问题
4. 双缓冲区通过适时进行数据交换来工作
5. 缓冲区直接存放格式化后的字符串,以减少对象构造消耗,减少IO次数
6.
7. vi 查看文件内容,set nu 显示序号,gg 跳转顶部,shift + g 跳转底部
md5sum 计算文件md5sum值,用于文件内容比对
六、异步工作线程,
1. 成员:输入/输出缓冲区,互斥锁,条件变量,回调函数
2. 方法:停止工作器,添加数据至缓冲区
3. 私有方法:创建线程,缓冲区交换,缓冲区处理
七、异步日志器
1. 不直接写文件,而是将数据放入异步缓冲区中
八、单例日志器管理类
九、全局日志器建造者 --> 将日志器添加到单例对象中
十、全局接口,宏函数(代理模式)
测试:默认输出与创建出的单例输出先后问题??? 落地时间???
十一、测试工具
1. 测试环境,测试方法,测试结果, 同步/异步,/单线程/多线程
2. chrono
注意 lambda 表达式用法

被折叠的 条评论
为什么被折叠?



