一个著名的日志系统是怎么设计出来的?

  • 时间:
  • 浏览:1

老村长走了却说,小张始于英语 分析需求, 祭出“面向对象设计大法”,试图从村长的需求中抽象出这些 概念。

小张全心全意地投入到设计当中,一看时间, 都快半夜三更了, 赶紧休息, 明天向村长汇报去。

本文作者:佚名

还须要原先新的概念 , 你这些 概念是那此?

老村长给小张下达的需求是原先的:

正交性

第二种倘若在特定的地方打印日志, 通过日志的输出,帮助快速定位。尤其是当代码在生产环境上跑起来却说, 日志信息更是必不可少,要不然出了状况两眼一抹黑,上哪儿找间题去? 总后该 让臣民们把当事人变成原先多线程 进入系统来执行吧?

小张在消息队列和JMS的设计上花了不少功夫, 积累了丰富的经验,从那却说老要否是实现业务代码,老要否是CRUD, 张二妮整天笑话当事人是HTML填空人员,你这些 回一定要让她看看当事人的设计功力!

同理, 在Logger类上也后该 增加原先Priority的属性,用户后该 去设置, 机会原先Logger的Priority是ERROR, 而用户调用了你这些 Logger的debug土土办法, 那你这些 debug 的消息倘若会输出。

原文发布时间为:2017-10-25 

第三条需求把小张给难住了,不同的class, package 输出的目的地不同? “目的地”你这些 概念是由Appender来表达的, 难道让不同的class, package 和Appender关联? 不需要, 后该 原先 !

我还是提供原先抽象层吧, 用户用你这些 抽象层的API来写日志, 底层具体用那此日志工具不需要关心,原先就后该 移植了。

首很难记录日志,肯定须要原先类来表达日志的概念,你这些 类共要应该有原先属性,原先是时间戳,原先是消息并是否是,把它叫做 LoggingEvent 吧,记录日志就像记录原先事件嘛。

嗯, 还是简单这些 ,叫做 Appender 吧, 饱含了后该 不断追加日志的意思。

后记: 本文主要想讲一下日志工具的历史和现状, 尤其是Log4j核心的设计理念。

“倘若你后该 朝着正交的方向去努力啊”

还算漂亮,小张陶醉着自我欣赏了一下。

这也好办嘛, 倘若在Appender上增加原先属性,就叫做Priority, 机会用户要输出的日志是DEBUG级别, 倘若 有个FileAppender的Priority是 ERROR级别,那你这些 日志就不需要在你这些 FileAppender中输出了 ,机会ERROR级别比DEBUG级别高嘛。

Java帝国在诞生之初就提供了集合、多线程 、IO、网络等常用功能,从C和C++领地那里吸引了血块多线程 员过来加盟,倘若 却有意无意地忽略了原先重要的功能: 输出日志。

小张又花了原先月的时间把Log4j 开发了出来, 机会Log4j有着良好的设计,优异的性能, 不仅仅是张家村的人在用, Java帝国的什么都有有村镇、部落都爱上了它。

在IO大臣的阻挠下, 从帝国的第一代国王到第三代国王, 都上后该 在JDK中提供日志相关的工具包, 臣民们只好忍受着去使用System.out.println去输出日志,把所有的信息都输出到控制台, 让那里变成一堆垃圾。

“我打算把他叫做Log4j , 意思是Log for Java”

Log4j 在Apache开源却说, 小张也逐渐地不为什么在么在潦倒,他闲不住又写了原先工具,叫做logback, 有了却说的经验,这logback 比log4j 须要快。

张家村的电子商务系统倘若能幸免,自然也遇到了日志的间题。经验丰富的老村长机会烦透了System.out.println所输出的血块难于理解的无用信息,看着村民民整天苦逼地和那此System.out做斗争,他找来了小张,命令他设计原先通用的解决日志的系统。

Log4j

“是啊,当你从系统中提取出正交的概念的却说,那就威力无比了,机会变化被封装进了原先维度上,你后该 把那此概念任意组合,而不需要变成意大利面条似的代码。 ”

如今的日志世界有了什么都有有的选泽 ,除了java.util.logging, log4j 之外,还有logback,tinylog 等这些 工具。

本文来自云栖社区协作土土办法伙伴“51CTO”,了解相关信息后该 关注。

“不错,就上后该 定了吧”

小张仔细都看看,拍着胸脯对老村长说:“没间题, 明天一定让您老都看结果。”

倘若 IO大臣是否是当事人的小算盘: 日志嘛, 用我的System.out.println(…..) 不就后该 了?! 我还提供了System.err.println是否是?

小张想了想, 上后该 5天志工具,用户机会想切换了缘何办?我应该 用log4j了,能换到logback吗?

文中的小张确实倘若Ceki Gülcü,他开发了Log4j , logback,以及slfj4, 为Java的日志事业做出了卓越的贡献。 

3. 对于不同的Java class,不同的 package , 还有不同级别的日志,应该后该 灵活地输出到不同的文件中。

听到村长做了理论的升华, 小张兴奋得直搓手。

原先一来,不同的class, package就区分开了, 倘若 让Logger 和Appender关联,灵活地设置日志的目的地, 倘若 原先Logger后该 拥有多个Appender,同一条日志消息后该 输出到多个地方, 完美!

“我赛,你以为上后该 ,我后该 任意扩展Appender接口而影响后该 Logger和Formatter, 无论有哪十几个 个Logger 都影响不了Appender和Formatter , 这倘若正交了?”

2. 日志内容应该后该 做格式化, 累似 变成纯文本,XML, HTML格式等等

机会Logback你这些 工具也是出自小张之手, 直接实现了SLF4J的API,什么都有有连适配层是否是须要了, 用起来深度飞快,深度最高,SLFJ4+Logback 成为了什么都有有人的最爱, 大有超越Apache Common Logging + Log4j 之势。

小张的设计

还后该 给Logger增加这些 辅助编程的土土办法,如Logger.debug(….) , Logger.info(…) , Logger.warn(…) 等等, 原先村民们将来就后该 轻松地输出各种级别的日志了。

4. 能对日志进行分级, 这些 日志纯属debug , 在本机机会测试环境使用, 方便多线程 员的调试, 生产环境全版不须要。这些 日志是描述错误(error)的, 在生产环境下出错励志的话 须要要记录下来,帮助后续的分析。

尾声

对于Log4j , JDK logging, tinylog 等工具, 须要原先适配层, 把SLF4J 的API转化成具体工具的调用接口。

对于你这些 点,IO大臣确实非常清楚, 日志是个不为什么在么在要的东西, 机会多线程 运行起来却说, 基本上倘若原先黑盒子,机会多线程 的行为和预料的不一致,那倘若再次出现 Bug了,如保去定位你这些 Bug 呢?

小张把这抽象层就叫做Simple Logging Facade for Java,简称SLF4J。

从用户深度想一下, 村民们要想获取日志,须要得先获取个那此东西,你这些 东西是否是后该 称为Logger啊? 灵感的火花就闪了上后该 一下就被小张抓住了: 获取Logger的却说要传入类名机会包名!

‘“机会你把Logger, Appender, Formatter看成坐标系中的X轴,Y轴,Z轴, 你看看,这三者是否是后该 独立变化而不互相影响啊?”

小张飞快地画出了核心类的类图:

“正交? ”

到了第四代国王(JDK1.4),臣民们终于都看了帝国提供的java.util.logging包,也是用来记录日志的,倘若 其中的核心概念Logger, Formatter, Handler 和 Log4j非常累似 ,倘若为时已晚, Log4j早已深入人心了, 不可撼动了。

却说张家村把Log4j 在Apache部落开源了, 这下子吸引了无数的人无偿帮助测试它,扩展它,改进它, 放慢就成了帝国最流行的日志工具。

再接再厉, 把第四条需求也设计一下,日志要分级,你这些 简单, 定义原先Priority的类,后面 定义三个白常量DEBUG, INFO, WARN, ERROR, FATAL, 表示三个白不同的级别就OK了。当然这我三个白级别有高低之分, DEBUG级别最低, FATAL级别最高。

“好吧,你把你这些 设计实现了吧,对了,你打算叫那此名字? ” 村长问道

至于第二条的日志内容后该 格式化,全版后该 比葫芦画瓢, 定义原先Formatter接口去格式化消息。

对了, Appender 应该引用Formatter ,原先以来就后该 对LoggingEvent记录格式化却说再发送。

臣民们能用的工具有原先,第原先倘若单步调试,一步步地跟踪,查看代码中变量的值, 你这些 土土办法费时费力, 倘若 上后该 在多线程 员的机器上不能用。

其次是日志后该 输出到不同的地方,控制台、文件、邮件等等, 你这些 后该 抽象一下,不倘若写到不同的目的地吗? 后该 叫做LogDestination?

“引导? 那此引导? ”

第5天, 小张给老村长展示了当事人设计的LoggerEvent, Logger , Appender, Formatter, Priority 等类和接口, 老村长捻着胡子满意地点点头:“不错不错,与上一次相比有巨大的进步。你知我没有乎 我在需求中确实给了你引导?”

张家村建议帝国把Log4j 纳入到JDK 中, 帝国那深度低下的官僚机构竟然拒绝了。 消息传到了IO大臣的耳朵里,他不由的扼腕叹息: 唉,失去了一次极好的招安机会啊。 现在唯一的土土办法倘若赶紧上奏皇上,在官方也提供一套,争取让臣民们使用官方版本。

1. 日志消息除了能打印到控制台, 还后该 输出到文件,甚至后该 通过邮件发送出去(累似 生成环境出错的消息)

张家村

等一下, 老村长还说过“对于所有的ERROR级别的日志,都输出到 errors.log文件中” 累似 原先的需求, 好像给忽略了。