<aside>
💡
模仿log4j日志框架实现一个的日志模块
- 难点:Logformatter的init(),将一个字符串解析为模板
- 设计点:
- LogEventWrap:一个封装LogEvent和Logger的RAII类
- LoggerManager:一个管理Logger的单例类
- LogAppender:一个抽象基类,可以方便地扩展日志的输出地
- 一系列辅助函数:
- 优化用户使用方式,用户可使用流式方式或格式化方式进行日志内容的写入
- 包括一系列宏函数和inline,辅助函数创建LogEventWrap来实现日志的输出
</aside>
UML类图

LogFormatter
:日志格式器
- 与log4cpp的PatternLayout对应,用于格式化一个日志事件(输出log4j日志格式)。
- 该类构建时可以指定pattern,表示如何进行格式化。提供format方法,用于将日志事件格式化成字符串。
- pattern中每个模板参数或字符串对应一个FormatItem派生类
LogAppender
:日志输出器
- 用于将一个日志事件输出到对应的输出地。
- 类内部包含一个LogFormatter成员和一个log方法,日志事件先经过LogFormatter格式化后再输出到对应的输出地。
- 从这个类可以派生出不同的Appender类型,比如StdoutLogAppender和FileLogAppender,分别表示输出到终端和文件。
- 由于有多种输出地,所以该类成为一个抽象基类,其派生类必须重写它的log方法
Logger
:日志器
- 负责进行日志输出
- 一个Logger包含多个LogAppender和一个日志级别
- 提供log方法,传入日志事件,判断该日志事件的级别高于日志器本身的级别之后调用LogAppender将日志进行输出,否则该日志被抛弃。
LogEvent
:日志事件
- 用于记录日志现场,比如该日志的级别,文件名/行号,日志消息,线程/协程号,所属日志器名称等。
LogEventWrap
:日志事件包装类
- LogEventWrap是一个RAII类
- LogEventWrap在构造时指定日志事件和日志器
- 在析构时调用日志器的log方法将日志事件进行输出
- LogEventWrap将日志事件和日志器包装到一起
- 一条日志只会在一个日志器上进行输出
- 将日志事件和日志器包装到一起后,方便通过宏定义来简化日志模块的使用。
- 为什么需要LogEventWrap?
- 由于LogEvent::ptr是智能指针,所以如果直接创建LogEvent::ptr,智能指针将在主函数结束时才释放。
- LogEventWrap的getSS()方法支持以流式方式将日志写入logger
- 使用RAII类管理LogEvent,可以在LogEventWrap析构时自动提交日志事件,并将其释放
LogManager
:日志器管理类
- 单例模式,用于统一管理所有的日志器,提供日志器的创建与获取方法
- LogManager应成为创建Logger的唯一方式,所有的Logger都应该经由LogManager获取
- 通过singleton.h中定义的单例类GetInstance方法返回LoggerManager的单例对象
- getRoot方法:LogManager自带一个root Logger,用于为日志模块提供一个初始可用的日志器。
- getLogger方法:根据一个名字搜索容器中已有的logger或新建一个logger
LogFormatter
<aside>
💡
LogFormatter用于将日志事件LogEvent格式化(模仿log4j日志框架)
</aside>
pattern
/**
* @brief 构造函数
* @param[in] pattern 格式模板,参考sylar与log4cpp
* @details 模板参数说明:
* %m 消息
* %p 日志级别
* %r 累计毫秒数
* %c 日志名称
* %t 线程id
* %n 换行
* %d 时间
* %f 文件名
* %l 行号
* %T 制表符
* %F 协程id
* %N 线程名称
*
*/
默认格式
- 默认格式:
"%d{%Y-%m-%d %H:%M:%S}%T%t%T%N%T%F%T[%p]%T[%c]%T%f:%l%T%m%n"
- 描述:年-月-日 时:分:秒 [累计运行毫秒数] \t 线程id \t 线程名称 \t 协程id \t [日志级别] \t [日志器名称] \t 文件名:行号 \t 日志消息 换行符
结构
嵌套类FormatItem
- FormatItem:日志内容格式化项,一个抽象基类,每个格式模板参数实现一个FormatItem的派生类
void format(std::ostream os, LogEvent::ptr event)
:将event中对应模板参数的内容格式化后写入os