目录
- 日志落地类(工厂模式)
- 双缓冲区异步处理器
- 缓冲区
- 异步工作器
- 日志器类
- 同步日志器
- 异步日志器
- 构造日志器
- 构造局部日志器
- 构造全局日志器
- 日志器管理器(单例模式)
- 日志宏&全局接口(代理模式)
源码: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 接口(根据基类接口构造出的各组件和属性,实际创建出一个全局日志器,同时创建管理器单例,将其添加到这个管理器单例中)
- 此后可以随时通过管理器访问创建好的日志器,也可随时创建并添加新的日志器
日志宏&全局接口(代理模式)
使用代理模式,定义宏和全局接口以简化用户操作