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

  • 时间:
  • 浏览:3

“不错,就没有定了吧”

“也不怎样才能愿意朝着正交的方向去努力啊”

对于有本身点,IO大臣随便说说非常清楚, 日志是个不为什么在么在要的东西, 怎样才能让tcp连接池池运行起来以前, 基本上也不一个 黑盒子,怎样才能让tcp连接池池的行为和预料的不一致,那也不出現Bug了,怎样才能去定位有本身Bug 呢?

其次是日志还要输出到不同的地方,控制台、文件、邮件等等, 有本身还要抽象一下,还会是写到不同的目的地吗? 还要叫做LogDestination?

Log4j

Log4j 在Apache开源以前, 小张也逐渐地不为什么在么在潦倒,他闲不住又写了一个 工具,叫做logback, 有了以前的经验,这logback 比log4j 还要快。

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

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

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

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

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

“好吧,你把有本身设计实现了吧,对了,你打算叫有本身名字? ” 村长问道

老村长给小张下达的需求是以前的:

4. 能对日志进行分级, 你你这名日志纯属debug , 在本机怎样才能让测试环境使用, 方便tcp连接池池员的调试, 生产环境删剪不还要。你你这名日志是描述错误(error)的, 在生产环境下出错说说还要要记录下来,帮助后续的分析。

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

尾声

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

怎样才能让Logback有本身工具也是出自小张之手, 直接实现了SLF4J的API,也不连适配层还会还要了, 用起来下行速率 太快,下行速率 最高,SLFJ4+Logback 成为了也不人的最爱, 大有超越Apache Common Logging + Log4j 之势。

张家村

臣民们能用的工具一个 ,第一个 也不单步调试,一步步地跟踪,查看代码中变量的值, 有本身法子费时费力, 怎样才能让不到在tcp连接池池员的机器上不能用。

本文作者:佚名

同理, 在Logger类上也还要增加一个 Priority的属性,用户还要去设置, 怎样才能让一个 Logger的Priority是ERROR, 而用户调用了有本身Logger的debug法子, 那有本身debug 的消息也不会输出。

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

如今的日志世界有了也不的选则 ,除了java.util.logging, log4j 之外,还有logback,tinylog 等你你这名工具。

第二种也不在特定的地方打印日志, 通过日志的输出,帮助快速定位。尤其是当代码在生产环境上跑起来以前, 日志信息更是必不可少,要不然出了清况 两眼一抹黑,上哪儿找问题去? 总不到让臣民们把我本人变成一个 tcp连接池进入系统来执行吧?

小张的设计

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

“正交? ”

Java帝国在诞生之初就提供了集合、tcp连接池、IO、网络等常用功能,从C和C++领地那里吸引了几瓶tcp连接池池员过来加盟,怎样才能让却有意无意地忽略了一个 重要的功能: 输出日志。

嗯, 还是简单你你这名,叫做 Appender 吧, 暗含了还要不断追加日志的意思。

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

“引导? 有本身引导? ”

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

前言

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

正交性

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

“我赛,随便说说 没有,我想任意扩展Appender接口而影响不到Logger和Formatter, 无论有几只个Logger 都影响不了Appender和Formatter , 这也不正交了?”

张家村的电子商务系统也不能幸免,自然也遇到了日志的问题。经验充沛的老村长怎样才能让烦透了System.out.println所输出的几瓶难于理解的无用信息,看着村民民整天苦逼地和有本身System.out做斗争,他找来了小张,命令他设计一个 通用的外理日志的系统。

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

怎样才能让IO大臣还会我本人的小算盘: 日志嘛, 用我的System.out.println(…..) 不就还要了?! 我还提供了System.err.println还会?

这也好办嘛, 怎样才能让在Appender上增加一个 属性,就叫做Priority, 怎样才能让用户要输出的日志是DEBUG级别, 怎样才能让有个FileAppender的Priority是 ERROR级别,那有本身日志就还会在有本身FileAppender中输出了 ,怎样才能让ERROR级别比DEBUG级别高嘛。

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

还要给Logger增加你你这名辅助编程的法子,如Logger.debug(….) , Logger.info(…) , Logger.warn(…) 等等, 以前村民们将来就还要轻松地输出各种级别的日志了。

小张想了想, 没有7天 志工具,用户怎样才能让想切换了为什么在办?愿意用log4j了,能换到logback吗?

小张在消息队列和JMS的设计上花了不少功夫, 积累了充沛的经验,从那以前时不时还会实现业务代码,时不时还会CRUD, 张二妮整天笑话我本人是HTML填空人员,有本身回一定要让她看看我本人的设计功力!

我还是提供一个 抽象层吧, 用户用有本身抽象层的API来写日志, 底层具体用有本身日志工具还会关心,以前就还要移植了。

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

首不难 记录日志,肯定还要一个 类来表达日志的概念,有本身类大慨应该一个 属性,一个 是时间戳,一个 是消息有本身,把它叫做 LoggingEvent 吧,记录日志就像记录一个 事件嘛。

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

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

以前一来,不同的class, package就区分开了, 怎样才能让让Logger 和Appender关联,灵活地设置日志的目的地, 怎样才能让一个 Logger还要拥有多个Appender,同一根日志消息还要输出到多个地方, 完美!

来源:51CTO

至于第二条的日志内容还要格式化,删剪还要比葫芦画瓢, 定义一个 Formatter接口去格式化消息。

‘“怎样才能愿意把Logger, Appender, Formatter看成坐标系中的X轴,Y轴,Z轴, 你看看,这三者是还会还要独立变化而不互相影响啊?”

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

还还要一个 新的概念 , 有本身概念是有本身?

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

第三条需求把小张给难住了,不同的class, package 输出的目的地不同? “目的地”有本身概念是由Appender来表达的, 难道让不同的class, package 和Appender关联? 还会, 不到以前 !

从用户深度1想一下, 村民们要想获取日志,还要得先获取个有本身东西,有本身东西是还会还要称为Logger啊? 灵感的火花就闪了没有一下就被小张抓住了: 获取Logger的以还要传入类名怎样才能让包名!

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

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

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

“是啊,当你从系统中提取出正交的概念的以前,那就威力无比了,怎样才能让变化被封装下 了一个 维度上,怎样才能愿意把有本身概念任意组合,而还会变成意大利面条似的代码。 ”