作家
登录

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

作者: 来源: 2017-10-25 16:23:47 阅读 我要评论

媒介

Java帝国在出生之初就供给了集合、线程、IO、收集等常用功能,大年夜C和C++领地那边吸引了大年夜量法度榜样员过来加盟,然则却竽暌剐意无意地忽视了一个重要的功能: 输出日记。

对于这一点,IO大年夜臣其实异常清跋扈, 日记是个很重要的器械, 因为法度榜样运行起来今后, 根本上就是一个黑盒子,如不雅法度榜样的行动和预感的不一致,那就是出现Bug了,若何去定位这个Bug 呢?

臣平易近们能用的对象有两个,第一个就是单步调试,一步步地跟踪,查看代码中变量的值, 这种办法费时辛苦, 并且只能在法度榜样员的机械上才能用。


老村长给小张下达的需求是如许的:

第二种就是在特定的处所打印日记, 经由过程日记的输出,赞助快速定位。尤其是现代码在临盆情况上跑起来今后, 日记信息更是必弗成少,要不然出了状况两眼一抹黑,上哪儿找问题去? 总不克不及让臣平易近们把本身变成一个线程进入体系来履行吧?

在IO大年夜臣的阻拦下, 大年夜帝国的第一代国王到第三代国王, 都没有在JDK中供给日记相干的对象包, 臣平易近们只好忍耐着去应用System.out.println去输出日记,把所有的信息都输出到控制台, 让那边变成一堆垃圾。

张家村

张家村的电子商务体系也不克不及幸免,天然也碰到了日记的问题。经验丰富的老村长已经烦透了System.out.println所输出的大年夜量难于懂得的无用信息,看着村平易近平易近成天苦逼地和这些System.out做斗争,他找来了小张,敕令他设计一个通用的处理日记的体系。

小张在消息队列和JMS的设计上花了不少工夫, 积聚了丰富的经验,大年夜那今后一向都是实现营业代码,一向都是CRUD, 张二妮成天笑话本身是HTML填空人员,这一回必定要让她看看本身的设计功力!

至于第二条的日记内容可以格局化,完全可以比葫芦画瓢, 定义一个Formatter接口去格局化消息。

1. 日记消息除了能打印到控制台, 还可以输出到文件,甚至可以经由过程邮件发送出去(例如生成情况掉足的消息)

2. 日记内容应当可以做格局化, 例如变成纯文本,XML, HTML格局等等

3. 对于不合的Java class,不合的 package , 还有不合级其长日记,应当可以灵活地输出到不呵9依υ?件中。

  • 例如对于com.foo 这个package,所有的日记都输出到 foo.log 文件中
  • 对于com.bar 这个package ,所有文件都输出到bar. log文件中
  • 对于所有的ERROR级其长日记,都输出到 errors.log文件中

4. 能对日记进行分级, 有些日记纯属debug , 在本机或者测试情况应用, 便利法度榜样员的调试, 临盆情况完全不须要。有些日记是描述缺点(error)的, 在临盆情况下掉足的话必须要记录下来,赞助后续的分析。

小张细心看了看,拍着胸脯对老村长说:“没问题, 明天必定让内里看到结不雅。”

小张的设计

老村长走了今后,小张开端分析需求, 祭出“面向对象设计大年夜法”,试图大年夜村长的需求中抽象出一点概念。

起重要记录日记,肯定须要一个类来表达日记的概念,这个类至少应当有两个属性,一个是时光戳,一个是消息本身,把它叫做 LoggingEvent 吧,记录日记就像记录一个事宜嘛。

嗯, 照样简单一点,叫做 Appender 吧, 暗含了可以赓续追加日记的意思。

一个有名的日记体系是怎么设计出来的?

一个有名的日记体系是怎么设计出来的?

对了, Appender 应当引用Formatter ,如许以来就可以对LoggingEvent记录格局化今后再发送。

第三条需求把小张给难住了,不合的class, package 输出的目标地不合? “目标地”这个概念是由Appender来表达的, 难道让不合的class, package 和Appender接洽关系? 不不, 不克不及如许 !

还须要一个新的概念 , 这个概念是什么?

大年夜用户角度想一下, 村平易近们要想获取日记,必须得先获取个什么器械,这个器械是不是可以称为Logger啊? 灵感的火花就闪了那么一下就被小张抓住了: 获取Logger的时刻要传仁攀类名或者包名!

一个有名的日记体系是怎么设计出来的?

如许一来,不合的class, package就区分开了, 然后让Logger 和Appender接洽关系,灵活地设置日记的目标地, 并且一个Logger可以拥有多个Appender,同一条日记消息可以输出到多个处所, 完美!

一个有名的日记体系是怎么设计出来的?

小张敏捷地画出了核心类的类图:

一个有名的日记体系是怎么设计出来的?

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

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


  推荐阅读

  大数据和Hadoop时代的维度建模和Kimball数据集市

维度建模已逝世?在答复这个问题之前,让我们回头来看看什么是所谓的维度数据建模。Hadoop 平台的供给商并没有忽视这些 Hadoop 的限制,例如 Hive 就供给了知足 ACID 的事务和可更新的表。根据大年夜量的重要公开问题>>>详细阅读


本文标题:一个著名的日志系统是怎么设计出来的?

地址:http://www.17bianji.com/lsqh/38204.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)