概述
日志消息是由许多要素组成,而日志格式化的主要作用,即是对日志消息进行格式化,组织成自己指定好的字符串结构
总体架构
日志消息(LogMsg)
用于存储各种日志信息,例如存储日志的级别、时间、行号等信息
格式化子项(FormerItem)
用于输出每一条单个的日志消息
该出设计成继承方法,首先实现一个抽象基类,该基类实现所有格式化子项的公共接口;然后子类继承该抽象类,实现其具体化的格式化逻辑,比如输出时间、级别等信息
格式化器(Formatter)
作用:首先根据用户指定的pattern 将其解析成字符串(key:value)数组存储,然后根据解析的结果,生成具体的FormatItem实例对象,然后将这些对象放入到Items中存储,从而实现不同场景下生成不同日志信息的目的。
将解析和打印日志信息放在一起,目的是为了一个接口实现指定日志打印。
该模块架构总结:采用工厂模式,创建具体格式化子项,可以根据用户提供的不同pattern生成不同的格式化子项。借助该模式,实现快速拓展格式化子项,因为只需要在抽象类下添加新的子类即可。
具体实现
格式化子项的定义与实现
- 基础类:FormatItem
- 共享指针管理创建的实例对象,父类指针指向子类对象,从而实现调用子类对象成员函数的目的
- 定义纯虚函数 format,子类就是通过重写该函数,实现不同的格式化日志消息
- 子类:具体实现不同日志内容
- 子类重写父类的format函数,然后生成不同的日志信息,比如日志级别、格式化时间等
pattern解析逻辑
pattern解析逻辑
初始状态:
- 初始化一些临时变量,
format_key
用于存储格式化字符(%d %p),format_val
用于存储子格式字符串(如时间格式),string_row
用于存储非格式化字符。- 使用一个向量
arry
来存储解析后的结果