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

  • 时间:
  • 浏览:1
  • 来源:UU快3直播官网

“却说给你朝着正交的方向去努力啊”

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

张家村的电子商务系统却说能幸免,自然也遇到了日志的问题报告 报告 。经验充裕的老村长将会烦透了System.out.println所输出的几瓶难于理解的无用信息,看着村民民整天苦逼地和哪此System.out做斗争,他找来了小张,命令他设计却说通用的处理日志的系统。

“是啊,当你从系统中提取出正交的概念的却说,那就威力无比了,将会变化被封装进去了却说维度上,给你把哪此概念任意组合,而很多再变成意大利面条似的代码。 ”

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

我还是提供却说抽象层吧, 用户用这俩抽象层的API来写日志, 底层具体用哪此日志工具很多再关心,却说就可不还要移植了。

本文作者:佚名

Log4j 在Apache开源却说, 小张也逐渐地有点儿家道中落,他闲不住又写了却说工具,叫做logback, 有了却说的经验,这logback 比log4j 还要快。

首很难记录日志,肯定还要却说类来表达日志的概念,这俩类至少应该有却说属性,却说是时间戳,却说是消息两种,把它叫做 LoggingEvent 吧,记录日志就像记录却说事件嘛。

小张的设计

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

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

前言

从用户深度1想一下, 村民们要想获取日志,还要得先获取个哪此东西,这俩东西是完全都是可不还要称为Logger啊? 灵感的火花就闪了很难 一下就被小张抓住了: 获取Logger的却说要传入类名将会包名!

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

小张想了想, 很难 四天志工具,用户将会想切换了要怎样办?我你要用log4j了,能换到logback吗?

老村长给小张下达的需求是却说的:

4. 能对日志进行分级, 所以日志纯属debug , 在本机将会测试环境使用, 方便程序运行运行员的调试, 生产环境完全不还要。所以日志是描述错误(error)的, 在生产环境下出错得话还要要记录下来,帮助后续的分析。

“不错,就很难 定了吧”

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

却说IO大臣完全都是我本人的小算盘: 日志嘛, 用我的System.out.println(…..) 不就可不还要了?! 我还提供了System.err.println完全都是?

小张越来很快地画出了核心类的类图:

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

老村长走了却说,小张结束分析需求, 祭出“面向对象设计大法”,试图从村长的需求中抽象出所以概念。

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

对了, Appender 应该引用Formatter ,却说以来就可不还要对LoggingEvent记录格式化却说再发送。

至于第二条的日志内容可不还要格式化,完全可不还要比葫芦画瓢, 定义却说Formatter接口去格式化消息。

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

2. 日志内容应该可不还要做格式化, 这俩 变成纯文本,XML, HTML格式等等

小张在消息队列和JMS的设计上花了不少功夫, 积累了充裕的经验,从那却说一个劲 完全都是实现业务代码,一个劲 完全都是CRUD, 张二妮整天笑话我本人是HTML填空人员,这俩回一定要让她看看我本人的设计功力!

“引导? 哪此引导? ”

第三条需求把小张给难住了,不同的class, package 输出的目的地不同? “目的地”这俩概念是由Appender来表达的, 难道让不同的class, package 和Appender关联? 很多再, 只有却说 !

嗯, 还是简单所以,叫做 Appender 吧, 富含了可不还要不断追加日志的意思。

张家村

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

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

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

尾声

第二种却说在特定的地方打印日志, 通过日志的输出,帮助快速定位。尤其是当代码在生产环境上跑起来却说, 日志信息更是必不可少,要不然出了情况汇报两眼一抹黑,上哪儿找问题报告 报告 去? 总只有让臣民们把我本人变成却说程序运行运行进入系统来执行吧?

“我赛,他们说很难 ,给给你任意扩展Appender接口而影响只有Logger和Formatter, 无论有十几个 个Logger 都影响不了Appender和Formatter , 这却说正交了?”

来源:51CTO

其次是日志可不还要输出到不同的地方,控制台、文件、邮件等等, 这俩可不还要抽象一下,很多再是写到不同的目的地吗? 可不还要叫做LogDestination?

对于这俩点,IO大臣虽然非常清楚, 日志是个有点儿要的东西, 将会程序运行运行运行起来却说, 基本上却说却说黑盒子,将会程序运行运行的行为和预料的不一致,那却说出现 Bug了,要怎样去定位这俩Bug 呢?

将会Logback这俩工具也是出自小张之手, 直接实现了SLF4J的API,所以连适配层完全都是还要了, 用起来下行速率 越来很快,下行速率 最高,SLFJ4+Logback 成为了所以人的最爱, 大有超越Apache Common Logging + Log4j 之势。

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

臣民们能用的工具有却说,第却说却说单步调试,一步步地跟踪,查看代码中变量的值, 这俩办法费时费力, 却说只有在程序运行运行员的机器上才能用。

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

Log4j

如今的日志世界有了所以的选者 ,除了java.util.logging, log4j 之外,还有logback,tinylog 等所以工具。

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

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

同理, 在Logger类上也可不还要增加却说Priority的属性,用户可不还要去设置, 将会却说Logger的Priority是ERROR, 而用户调用了这俩Logger的debug办法, 那这俩debug 的消息却说会输出。

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

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

还还要却说新的概念 , 这俩概念是哪此?

却说一来,不同的class, package就区分开了, 却说让Logger 和Appender关联,灵活地设置日志的目的地, 却说却说Logger可不还要拥有多个Appender,同一条日志消息可不还要输出到多个地方, 完美!

正交性

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

还可不还要给Logger增加所以辅助编程的办法,如Logger.debug(….) , Logger.info(…) , Logger.warn(…) 等等, 却说村民们将来就可不还要轻松地输出各种级别的日志了。

这也好办嘛, 倘若在Appender上增加却说属性,就叫做Priority, 将会用户要输出的日志是DEBUG级别, 却说有个FileAppender的Priority是 ERROR级别,那这俩日志就很多再在这俩FileAppender中输出了 ,将会ERROR级别比DEBUG级别高嘛。

Java帝国在诞生之初就提供了集合、程序运行运行、IO、网络等常用功能,从C和C++领地那里吸引了几瓶程序运行运行员过来加盟,却说却有意无意地忽略了却说重要的功能: 输出日志。

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

“正交? ”

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