一,模块主要成员
该模块的主要作用是对日志消息进行格式化,将日志消息组织成制定格式的字符串。
该模块主要成员有两个:1.格式化字符串。 2.格式化子项数组
1.1 格式化字符串
格式化字符串的主要功能是保存日志输出的格式字符串。其格式化字符主要有下面几种
格式化字符串定义了日志的输出格式,而格式化字符更有助于用户自由的控制日志的输出格式 。这里要注意的是由于我们信息中的日期为时间戳,因此在设置其格式化字符时还应设置对应的子格式化字符如[%d{%H:%M:%S}]指的是按照年月日输出时间
1.2 格式化子项数组
格式化子项数组:用于按顺序保存格式化字符串对应的子格式化对象(FormatItem类)。
那么什么是子格式化类(FormatItem类)?子格式化类主要负责日志消息子项的获取以及格式化,其下包含诸多子类,通过继承关系实现多态,即使是不同的子类也能依靠多态由相同的父类指针指向,从而保存到同一个vector中,Formatltem主要有以下子类:
格式化字符,以及格式化子项的关系如下,这里我们以日期为例子
1.3 举例说明
例子:"[%d{%H:%M:%S}] %m%n"
pattern = "[%d{%H:%M:%S}] %m%n"
items = {
{OtherFormatItem(), "["},
{TimeFormatItem(), "%H:%M:%S"},
{OtherFormatItem(), "]"},
{MsgFormatItem (), ""},
{NLineFormatItem (), ""}
}
message msg = {
size_t _line = 22;
size_t _ctime = 12345678;
std::thread::id _tid = 0x12345678;
std::string _logger = "logger";
std::string _file = "main.cpp";
std::string _payload = "创建套接字失败";
LogLevel::level _level = ERROR;
};
格式化的过程其实就是按次序从Msg中取出需要的数据进⾏字符串的连接的过程。
最终组织出来的格式化消息: "[22:32:54] 创建套接字失败\n"
二,代码实现
2.1 代码
核心代码bool AnalyPattern()的分析如下