阿里大佬谈日志系统:如何执行日志输出的唯一方式
明天转载阿里的大鳄写的十分不错的一篇文章,看完以后相信日志系统会有愈发深刻的理解。
作为Java程序员,我想好多人都晓得日志对于一个程序的重要性,尤其是Web应用。好多时侯,日志可能是我们了解应用程序怎样执行的惟一方法。
所以,日志在JavaWeb应用中至关重要,然而,好多人却以为日志输出只是一件简单的事情,所以会常常忽视和日志相关的问题。
在接出来的几篇文章中,我会来介绍介绍这个容易被你们忽略,但同时也容易造成故障的知识点。
Java语言之所以强悍,就是由于他很成熟的生态体系。包括日志这一功能,就有好多成熟的开源框架可以被直接使用。
首先,我们先来看一下目前有什么框架被广泛的使用。
常用日志框架
j.u.l
j.u.l是java.util.包的简称,是JDK在1.4版本中引入的Java原生日志框架。JavaAPI提供了七个日志级别拿来控制输出。这七个级别分别是:、、INFO、、FINE、FINER、。
Log4j
Log4j是的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套插口服务器、NT的风波记录器、UNIX守护进程等;我们也可以控制每一条日志的输出格式;
通过定义每一条日志信息的级别,我们就能愈发细致地控制日志的生成过程。Log4也有七种日志级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG和TRACE。
最令人感兴趣的就是,这种可以通过一个配置文件来灵活地进行配置,而不须要更改应用的代码。

也是一个很成熟的日志框架,虽然和Log4j出自一个人之手,这个人就是CekiGülcü。
当前分成三个模块:-core,-和-。
-core是其它两个模块的基础模块。
-是Log4j的一个改良版本。据悉-完整实现SLF4JAPI使你可以很便捷地更换成其它日记系统如Log4j或j.u.l。
-访问模块与容器集成提供通过Http来访问日记的功能。
后面介绍过Log4j,这儿要单独介绍一下,之所以要单独掏出来说,而没有和Log4j置于一起介绍,是由于作者觉得,早已不仅仅是Log4j的一个升级版本了,而是从头到尾被重画的,这可以觉得这或许就是完全不同的两个框架。
关于解决了Log4j的什么问题,相比较于Log4j、j.u.l和有什么优势,我们在后续的文章中介绍。
严禁直接使用Log框架API?
后面介绍了四种日志框架,也就是说,我们想要在应用中复印日志的时侯,可以使用以上四种例程中的任意一种。例如想要使用Log4j,这么只要依赖Log4j的jar包,配置好配置文件而且在代码中使用其API复印日志就可以了。
不晓得有多少人看过《阿里巴巴Java开发指南》,其中有一条规范做了『强制』要求:
说好了以上四种常用的日志框架是给Java应用提供的便捷进行记录日志的,那为何又不让在应用中直接使用其API呢?这儿面推崇使用的SLF4J是哪些呢?所谓的店面模式又是哪些东西呢?
哪些是日志店面
日志店面,是店面模式的一个典型的应用。
店面模式(),亦称之为外形模式,其核心为:外部与一个子系统的通讯必须通过一个统一的外型对象进行,促使子系统更便于使用。
如同上面介绍的几种日志框架一样,每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的降低应用程序代码对于日志框架的耦合性。
为了解决这个问题,就是在日志框架和应用程序之间架设一个沟通的桥梁,对于应用程序来说,无论底层的日志框架怎么变,都不须要有任何感知。只要店面服务做的足够好,随便换另外一个日志框架,应用程序不须要更改任意一行代码,就可以直接上线。
在软件开发领域有这样一句话:计算机科学领域的任何问题都可以通过降低一个间接的中间层来解决。而店面模式就是对于这句话的典型实践。
为何须要日志店面
后面提及过一个重要的缘由,就是为了在应用中屏蔽掉底层日志框架的具体实现。这样的话,就算有三天要更换代码的日志框架,只须要更改jar包,最多再改改日志输出相关的配置文件就可以了。这就是解除了应用和日志框架之间的耦合。
有人也许会问了,若果我换了日志框架了,应用是不须要改了,那日志店面不还是须要改的吗?
要回答这个问题,我们先来举一个反例,再把店面模式弄碎了重新解释一遍。
日志店面如同宾馆的服务员,而日志框架如同是后厨的面点师。对于客户这个应拿来说,我到酒店点菜,我只须要告诉服务员我要一盘青椒炒饭即可,我不关心后厨的所有事情。由于即使大厨从把这道菜称之为『莴苣炒饭』A面点师换成了把这道菜称之为『猕猴桃炒虾仁』的B面点师。并且,顾客不须要关心,他只要下达『莴苣炒饭』的命令给到服务员,由服务员再去翻译给面点师就可以了。
所以,对于一个了解了”番茄炒饭的多种别称”的服务员来说,无论后厨怎么换面点师,他都能确切的帮用户下单。
同理,对于一个设计的全面、完善的日志店面来说,他也应当是天然就兼容了多种日志框架的。所以,底层框架的更换,日志店面几乎不须要改动。
以上logback中有mdc功能么,就是日志店面的一个比较重要的用处——解耦。
常用日志店面
介绍过了日志店面的概念和用处以后,我们瞧瞧Java生态体系中有什么好的日志店面的实现可供选择。
SLF4J
Java简易日志店面(forJava,简写SLF4J),是一套包装框架的界面程式logback中有mdc功能么,以外型模式实现。可以在软件布署的时侯决定要使用的框架,目前主要增援的有JavaAPI、Log4j及等框架。以MIT授权形式发布。
SLF4J的作者就是Log4j和的作者CekiGülcü,他声称SLF4J比Log4j更有效率,但是比(JCL)简单、稳定。
虽然,SLF4J虽然只是一个店面服务而已,他并不是真正的日志框架,真正的日志的输出相关的实现还是要依赖Log4j、等日志框架的。
因为SLF4J比较常用,这儿多用一些篇幅,再来简单剖析一下SLF4J,主要和Log4J做一下对比。相比较于Log4J的API,SLF4J有以下几点优势:
// 传统的字符串产生方式,如果没有要记录Debug等级的信息,就会浪费时间在产生不必要的信息上
logger.debug("There are now " + count + " user accounts: " + userAccountList);
// 为了避免上述问题,我们可以先检查是不是开启了Debug信息记录功能,只是程序的编码会比较复杂
if (logger.isDebugEnabled()) {
logger.debug("There are now " + count + " user accounts: " + userAccountList);
}
// 如果Debug等级没有开启,则不会产生不必要的字符串,同时也能保持程序编码的简洁
logger.debug("There are now {} user accounts: {}", count, userAccountList);
-
是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型。它通过其他一些工具提供API,日志实现和包装器实现。
-和SLF4J的功能是类似的,主要是拿来做日志店面的。提供愈发好友的API工具。
总结
在Java生态体系中,围绕着日志,有好多成熟的解决方案。关于日志输出,主要有两类工具。
一类是日志框架,主要拿来进行日志的输出的,例如输出到那个文件,日志格式怎么等。另外一类是日志店面,主要一套通用的API,拿来屏蔽各个日志框架之间的差别的。
所以,对于Java工程师来说,关于日志工具的使用,最佳实践就是在应用中使用如Log4j+SLF4J这样的组合来进行日志输出。
这样做的最大益处,就是业务层的开发不须要关心底层日志框架的实现及细节,在编码的时侯也不须要考虑日后更换框架所带来的成本。这也是店面模式所带来的益处。
综上,请不要在你的Java代码中出现任何Log4j等日志框架的API的使用,而是应当直接使用SLF4J这些日志铺面。
原文链接:https://www.dyfan.vip/20684.html,请用户仔细辨认内容的真实性,避免上当受骗!