日志项目——日志系统框架设计
1.模块划分
0x1.日志等级模块
对输出日志的等级进行划分,以便于控制日志的输出(在具体项目测试时,可以打印调试日志用来debug,而当项目上线后,就不应该在打印debug日志,而只在乎致命的错误)。并且提供了将等级枚举转换成字符串的功能。
- DEBUG:调式,用于调式代码时输出关键信息
- INFO:提示,普通日志的输出
- WARNNING:警告,不影响程序运行,但是需要注意的日志
- ERROR:错误,程序运行出错时的日志
- FATAL:致命,一般出现就会导致程序终止,无法继续运行的日志
- OFF:关闭
有了以上几种等级,我们便可以随心设置,当我们设置等级为OFF时,所有的日志消息都无法被打印。
0x2.日志消息模块
在日志真正落地之前,用于存储一条日志的所有组成部分。而一条日志所包含的内容如下:
- 时间:日志输出的时间
- 线程ID:哪一个线程输出的该日志
- 日志等级:该日志的类型
- 文件名:该日志是从那个源文件中输出的
- 行号:具体的行号
- 日志器名称:在内存中,可能同时存在多个日志器,日志器名称是日志器的唯一标识
- 正文:日志消息的具体内容,如套接字创建失败...
0x3.日志消息格式化模块
设置日志的输出格式,将日志消息按照指定的输出格式,生成一个字符串,交给最后的落地模块。
默认的输出格式为:"[%d{%Y%m%d-%H:%M:%S}][%t][%c][%f:%l][%p]%T%m%n"
- %d{%Y%m%d-%H:%M:%S}:时间,花括号内部表示时间的格式
- %t:线程ID
- %c:日志器名称
- %f:%l:文件名+行号
- %p:日志级别
- %T:制表符
- %m:正文
- %n:换行
0x4.日志消息落地模块
该模块决定日志消息最后输出到什么位置,标准输出,指定文件,还是滚动文件...
滚动文件:所有的日志消息如果都输出到一个文件中,会导致该文件大小变得非常大,不利于后续的日志分析。而滚动文件则可以根据当前文件的大小来切换文件(当文件内容达到1G,就创建一个新文件,日志消息输出到该新文件中),或者根据时间来切换(每天都创建一个新的文件,日志消息都只输出到当天的日志文件中)。
0x5.日志器模块
对以上模块的整合,用户使用日志器来进行日志的输出,而不是使用上面的模块中的几个接口来实现消息落地。
日志器包含有同步日志器和异步日志器。
- 同步日志器:业务线程自主实现日志的落地
- 异步日志器:业务线程将日志消息放到缓冲区中,然后就做自己的事,日志的真正落地,交给异步线程去做。
0x6.日志器管理模块
对在内存中所有的日志器进行管理,同时提供获取指定日志器名称的日志器,以便日志的输出操作。
日志器模块只能由一个实例,所以该模块是一个单例模块
0x7.异步线程模块
实现异步写日志的过程,本质上就是完成将日志从缓冲区读出来,在落地的整个过程。