一个日志框架的设计
# 03.一个日志框架的设计
日志框架内部的原理
# 前言
在介绍具体的框架怎么使用之前,我们先介绍其设计思路,这有助于我们理解和使用他们。
一个日志框架,如果让你来设计?应该怎么做?
首先得明确需求,这个框架应该能做什么:
- 除了能将日志打印到控制台,还能打印到文件,甚至可以通过网络发送邮件或 发到数据库里去存储。
- 日志应该能格式化输出。例如txt纯文本,xml格式甚至HTML格式等
- 日志内容应该有标准。例如代码执行的时间,执行的函数是什么,结果是什么,不能乱打一气
- 日志应该能够分级(前面我们讲过日志的级别)
- 对于不同的package,甚至不同的class,能灵活的输出到不同的地方。例如对于error的日志,则打印到error.log,对于成功的日志,则打到success.log
- ...................................
本文主要参考了《码农翻身》的一个小片段: 一个著名的日志系统是怎么设计出来的? (opens new window),已获得作者授权。
# 设计思路
既然是在Java中,首先得有个类用来表示日志的概念;一个是时间戳,一个是日志内容,我们称这个类为Logger。这样,用户在打印日志的时候,就可以用logger提供的方法
第一,既然要能将日志打印到多个地方,那么可以写个接口,具体的实现依靠子类:
取名叫Appender,指可以不断的追加(append)日志。
第二和第三,日志能格式化输出,那么同理,定义一个Formatter接口,具体的实现依赖于子类,里面包含了日期格式化等方法
第四,既然日志要分级,就定义一个常量类即可,里面分别有几个常量标书不同的级别。级别有高低之分。
第五,对于不同的package,甚至不同的类,如何做到输出的地方不同呢?在定义logger的时候传入包名或类名!
private static Logger logger = Logger.getLogger("com.peterjxl.logging");
1
# 正交性
以下内容来自一个著名的日志系统是怎么设计出来的? (opens new window)
如果你把Logger, Appender, Formatter看成坐标系中的X轴,Y轴,Z轴,这三者可以独立变化而不互相影响
可以任意扩展Appender接口而影响不到Logger和Formatter, 无论有多少个Logger 都影响不了Appender和Formatter , 这就是正交
当你从系统中提取出正交的概念的时候,那就威力无比了,因为变化被封装在了一个维度上,你可以把这些概念任意组合,而不会变成意大利面条似的代码。
在 GitHub 上编辑此页 (opens new window)
上次更新: 2024/3/24 02:47:36