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

  • 时间:
  • 浏览:0
  • 来源:uu快3新平台_uu快3诀窍_讨论群

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

张家村

小张的设计

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

对于这你是什么 ,IO大臣觉得非常清楚, 日志是个特别要的东西, 可能应用程序起来然后 , 基本上你是什么 另另一三个多多黑盒子,可能应用程序的行为和预料的不一致,那你是什么 无缘无故总出 Bug了,要怎样去定位你是什么 Bug 呢?

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

我还是提供另另一三个多多抽象层吧, 用户用你是什么 抽象层的API来写日志, 底层具体用哪些地方日志工具不必关心,原先就都可能够够移植了。

嗯, 还是简单你是什么 ,叫做 Appender 吧, 含有了都可能够够不断追加日志的意思。

首太难记录日志,肯定可能够够另另一三个多多类来表达日志的概念,你是什么 类大概应该有另另一三个多多属性,另另一三个多多是时间戳,另另一三个多多是消息两种 ,把它叫做 LoggingEvent 吧,记录日志就像记录另另一三个多多事件嘛。

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

小张又花了另另一三个多多月的时间把Log4j 开发了出来, 可能Log4j有着良好的设计,优异的性能, 不仅仅是张家村的人在用, Java帝国的要是有村镇、部落都爱上了它。

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

“不错,就没人定了吧”

小张想了想, 没人半年志工具,用户可能想切换了为什么么么办?让你用log4j了,能换到logback吗?

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

第二种你是什么 在特定的地方打印日志, 通过日志的输出,帮助快速定位。尤其是当代码在生产环境上跑起来然后 , 日志信息更是必不可少,要不然出了请况两眼一抹黑,上哪儿找大大问题 去? 总不到让臣民们把当时人变成另另一三个多多应用程序进入系统来执行吧?

“是啊,当你从系统中提取出正交的概念的然后 ,那就威力无比了,可能变化被封放到了另另一三个多多维度上,让你把哪些地方地方概念任意组合,而不必变成意大利面条似的代码。 ”

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

正交性

“正交? ”

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

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

从用户宽度想一下, 村民们要想获取日志,可能够够得先获取个哪些地方东西,你是什么 东西是可能够够都可能够够称为Logger啊? 灵感的火花就闪了没人一下就被小张抓住了: 获取Logger的然后 要传入类名可能包名!

对于Log4j , JDK logging, tinylog 等工具, 可能够够另另一三个多多适配层, 把SLF4J 的API转化成具体工具的调用接口。

Log4j

来源:51CTO

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

同理, 在Logger类上也都可能够够增加另另一三个多多Priority的属性,用户都可能够够去设置, 可能另另一三个多多Logger的Priority是ERROR, 而用户调用了你是什么 Logger的debug最好的法律措施, 那你是什么 debug 的消息你是什么 会输出。

4. 能对日志进行分级, 你是什么 日志纯属debug , 在本机可能测试环境使用, 方便应用程序员的调试, 生产环境全部不到。你是什么 日志是描述错误(error)的, 在生产环境下出错的话可能够够要记录下来,帮助后续的分析。

至于第二条的日志内容都可能够够格式化,完要是可能够够比葫芦画瓢, 定义另另一三个多多Formatter接口去格式化消息。

2. 日志内容应该都可能够够做格式化, 类事变成纯文本,XML, HTML格式等等

可能Logback你是什么 工具也是出自小张之手, 直接实现了SLF4J的API,要是有连适配层可能够够不到, 用起来速率很慢,速率最高,SLFJ4+Logback 成为了要是有人的最爱, 大有超越Apache Common Logging + Log4j 之势。

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

前言

如今的日志世界有了要是有的选用 ,除了java.util.logging, log4j 之外,还有logback,tinylog 等你是什么 工具。

尾声

臣民们能用的工具有另另一三个多多,第另另一三个多多你是什么 单步调试,一步步地跟踪,查看代码中变量的值, 你是什么 最好的法律措施费时费力, 你是什么 不到在应用程序员的机器还还可以够用。

“好吧,你把你是什么 设计实现了吧,对了,你打算叫哪些地方名字? ” 村长问道

你是什么 IO大臣可能够够当时人的小算盘: 日志嘛, 用我的System.out.println(…..) 不就都不到?! 我还提供了System.err.println可能够够?

还可能够够另另一三个多多新的概念 , 你是什么 概念是哪些地方?

Java帝国在诞生之初就提供了集合、应用程序、IO、网络等常用功能,从C和C++领地那里吸引了大量应用程序员过来加盟,你是什么 却有意无意地忽略了另另一三个多多重要的功能: 输出日志。

其次是日志都可能够够输出到不同的地方,控制台、文件、邮件等等, 你是什么 都可能够够抽象一下,不你是什么 写到不同的目的地吗? 都可能够够叫做LogDestination?

还都可能够够给Logger增加你是什么 辅助编程的最好的法律措施,如Logger.debug(….) , Logger.info(…) , Logger.warn(…) 等等, 原先村民们将来就都可能够够轻松地输出各种级别的日志了。

“引导? 哪些地方引导? ”

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

老村长走了然后 ,小张现在开始英文分析需求, 祭出“面向对象设计大法”,试图从村长的需求中抽象出你是什么 概念。

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

文中的小张觉得你是什么 Ceki Gülcü,他开发了Log4j , logback,以及slfj4, 为Java的日志事业做出了卓越的贡献。

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

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

小张在消息队列和JMS的设计上花了不少功夫, 积累了富于的经验,从那然后 无缘无故可能够够实现业务代码,无缘无故可能够够CRUD, 张二妮整天笑话当时人是HTML填空人员,你是什么 回一定要让她看看当时人的设计功力!

本文作者:佚名

这也好办嘛, 倘若在Appender上增加另另一三个多多属性,就叫做Priority, 可能用户要输出的日志是DEBUG级别, 你是什么 有个FileAppender的Priority是 ERROR级别,那你是什么 日志就不必在你是什么 FileAppender中输出了 ,可能ERROR级别比DEBUG级别高嘛。

小张很慢地画出了核心类的类图:

“你是什么 让你朝着正交的方向去努力啊”

对了, Appender 应该引用Formatter ,原先以来就都可能够够对LoggingEvent记录格式化然后 再发送。

张家村的电子商务系统你是什么 能幸免,自然也遇到了日志的大大问题 。经验富于的老村长可能烦透了System.out.println所输出的大量难于理解的无用信息,看着村民民整天苦逼地和哪些地方地方System.out做斗争,他找来了小张,命令他设计另另一三个多多通用的出理 日志的系统。

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

Log4j 在Apache开源然后 , 小张也逐渐地特别失意,他闲不住又写了另另一三个多多工具,叫做logback, 有了然后 的经验,这logback 比log4j 可能够够快。

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

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

原先一来,不同的class, package就区分开了, 你是什么 让Logger 和Appender关联,灵活地设置日志的目的地, 你是什么 另另一三个多多Logger都可能够够拥有多个Appender,同根小日志消息都可能够够输出到多个地方, 完美!

张家村建议帝国把Log4j 纳入到JDK 中, 帝国那速率低下的官僚机构竟然拒绝了。 消息传到了IO大臣的耳朵里,他不由的扼腕叹息: 唉,一蹶不振 了一次极好的招安可能啊。 现在唯一的最好的法律措施你是什么 赶紧上奏皇上,在官方也提供一套,争取让臣民们使用官方版本。

“我赛,青春恋爱物语没人,我都可能够够任意扩展Appender接口而影响不到Logger和Formatter, 无论有十多少 个Logger 都影响不了Appender和Formatter , 这你是什么 正交了?”