日志简介

我的个人网站:
http://riun.xyz/


参考阿里巴巴Java开发者社区

禁止直接使用日志系统(Log4j、Logback)中的API

常用日志框架

j.u.l

j.u.l是java.util.logging包的简称,是JDK在1.4版本中引入的Java原生日志框架。Java Logging API提供了七个日志级别来控制输出。分别是:SERVER、WARNING、INFO、CONFIG、FINE、FINER、FINEST。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2Cpkxxu-1589184319065)( https://ucc.alicdn.com/pic/developer-ecology/191e800cf163427da06b2c2ee87a62a2.png )]

Log4j

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Log4也有七种日志级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG和TRACE。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-axiaC33r-1589184319084)( https://ucc.alicdn.com/pic/developer-ecology/67798a67d5494646bd5337d829d4625a.png )]

LogBack

LogBack也是一个很成熟的日志框架,其实LogBack和Log4j出自一个人之手,这个人就是Ceki Gülcü。

logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是Log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如Log4j或j.u.l。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtDOfcMK-1589184319087)( https://ucc.alicdn.com/pic/developer-ecology/ce95748757ff483fab50c06f492f4cb4.png )]

Log4j2

Log4j2已经不仅仅是Log4j的一个升级版本了,而是从头到尾被重写的,这可以认为这其实就是完全不同的两个框架。


上述四种日志框架, 我们想要在应用中打印日志的时候,可以使用以上四种类库中的任意一种。比如想要使用Log4j,那么只要依赖Log4j的jar包,配置好配置文件并且在代码中使用其API打印日志就可以了。

但是《阿里巴巴Java开发手册》,其中有一条规范做了『强制』要求:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuUyEYsK-1589184319089)( https://ucc.alicdn.com/pic/developer-ecology/96e1e639282d4667813120346a5d257c.png )]

日志门面

日志门面,是门面模式的一个典型的应用。

门面模式(Facade Pattern),也称之为外观模式,其核心为:外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDAenn8J-1589184319091)( https://ucc.alicdn.com/pic/developer-ecology/e44aea7b82794669b3e77c80c1059bf6.png )]

前面介绍的日志框架,每一种都有他自己单独的API,要使用对于的框架就要使用其API,这就大大增加了应用程序对于日志框架的耦合性。

使用日志门面就是为了屏蔽掉底层日志框架的具体实现,即使以后某天要更换代码的日志框架,只需修改jar包,最多再修改相关日志输出的配置文件就可以了。这就解除了应用和日志框架之间的耦合。

SLF4J

SLF4J 的作者就是 Log4j 的作者 Ceki Gülcü

Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,以外观模式实现。可以在软件部署的时候决定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及logback等框架。以MIT 授权方式发布。

SLF4J就是一个常用的日志门面,即日志抽象层,并不是真正的日志框架,真正的输出还要依赖具体实现层日志框架(Log4j、logback等)。

优势

  • Log4j 提供 TRACE, DEBUG, INFO, WARN, ERROR 及 FATAL 六种纪录等级,但是 SLF4J 认为 ERROR 与 FATAL 并没有实质上的差别,所以拿掉了 FATAL 等级,只剩下其他五种。
  • 大部分人在程序里面会去写logger.error(exception),其实这个时候Log4j会去把这个exception tostring。真正的写法应该是logger(message.exception);而SLF4J就不会使得程序员犯这个错误。
  • 使用SLF4J可以方便的使用其提供的各种集体的实现的jar。(类似commons-logger)
  • 从commons–logger和Log4j merge非常方便,SLF4J也提供了一个swing的tools来帮助大家完成这个merge。
  • SLF4J 只支持 MDC,不支持 NDC。
  • Log4j间接的在鼓励程序员使用string相加的写法(这种写法是有性能问题的),而SLF4J提供了字符串内容替换的功能,就不会有这个问题 ,你可以使用logger.error(“{} is+serviceid”,serviceid);。而且这样的写法更有效率,说明如下:
//----------Log4j等
// 传统的字符串产生方式,如果没有要记录Debug等级的信息,就会浪费时间在产生不必要的信息上
logger.debug("There are now " + count + " user accounts: " + userAccountList);

// 为了避免上述问题,我们可以先检查是不是开启了Debug信息记录功能,只是程序的编码会比较复杂
if (logger.isDebugEnabled()) {
    logger.debug("There are now " + count + " user accounts: " + userAccountList);
}
//----------SLF4J
// 如果Debug等级没有开启,则不会产生不必要的字符串,同时也能保持程序编码的简洁
logger.debug("There are now {} user accounts: {}", count, userAccountList); 

commons-logging

Apache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型。它通过其他一些工具提供API,日志实现和包装器实现。

commons-logging和SLF4J的功能是类似的,主要是用来做日志 门面的。提供更加好友的API工具。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcVBfxBA-1589184319093)( https://ucc.alicdn.com/pic/developer-ecology/f03c0b80382e4999bc019a39af5828a8.png )]

总结

在Java生态体系中,围绕着日志,有很多成熟的解决方案。关于日志输出,主要有两类工具。

一类是日志框架,主要用来进行日志的输出的,比如输出到哪个文件,日志格式如何等。 另外一类是日志门面,主要一套通用的API,用来屏蔽各个日志框架之间的差异的。

所以,对于Java工程师来说,关于日志工具的使用,最佳实践就是在应用中使用如Log4j + SLF4J 这样的组合来进行日志输出。

这样做的最大好处,就是业务层的开发不需要关心底层日志框架的实现及细节,在编码的时候也不需要考虑日后更换框架所带来的成本。这也是门面模式所带来的好处。

综上,请不要在你的Java代码中出现任何Log4j等日志框架的API的使用,而是应该直接使用SLF4J这种日志门面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值