Java日志系统(上)

Java日志系统(上)


最近一段时间,公司的应用架构在向微服务架构转型,基本框架是Dubbo + zookeeper。在转型过程种,笔者从网上、书本上,对日志系统有了一些初步了解。找了个时间,这里把学习到的知识做个总结。本文部分内容节选自网上各路大神的博客、《分布式服务架构——原理、设计与实践》第4章。

1. 概述

日志是程序设计中很重要的一部分,它提供了丰富的程序运行时信息,例如:程序运行时的逻辑信息、错误信息、事件描述信息、关键数据、状态信息,以及用户的登录信息、操作信息,等等。这些日志信息可以帮助开发人员快速发现和定位问题。在实际生产环境种,日志也是查找问题的重要来源,良好的日志格式和记录方式可以帮助我们快速找到解决问题的办法。没有日志,甚至会失去对系统的可控性。

题外话:一个部署在Tomcat中的应用程序,在Tomcat\logs\文件夹下,有如下几种常见的日志类型。

  • Tomcat本地日志:通常为localhost.*.txt,该日志是应用程序异常,但是没有被捕获时会被一直抛出到容器层,容器处理后记录在这个日志里。

  • Tomcat存取日志:通常为localhost_access_log.*.txt,该日志是客户端访问日志,清晰地记录了HTTP服务请求的来源、响应时间、返回的HTTP代码等,可用于统计服务的成功数和失败数、接口的响应时间、服务的请求数和吞吐量等。

  • Tomcat控制台日志:通常为catalina.*.log或者catalina.out,该日志是引擎的日志文件,包含Tomcat是否成功启动、启动所用时间,一级应用程序打印的控制台日志等信息。

  • 应用程序日志:一般使用Commons logging、Log4j、Slf4j、Logback、Log4j2等框架生成应用程序的业务系统日志。后续会详细介绍。

2. 日志系统的门面模式

在JDK的最初版本中,不包含日志相关的API,直到JDK1.4才出现了JDK Logger。在此期间,开源社区的Apache Commons Logging和Apache Log4j成了应用最广泛的日志工具,甚至成为Java日志系统的事实上的标准。其中,Apache Commons Logging是通用的日志API,而Apache Log4j则是日志实现。后来,Slf4j和LogBack逐渐取代了Apache Commons Logging和Apache Log4j;Log4j的继任者Log4j2也迅速流行起来。

由于现在开源的日志系统较多,作为应用开发者,我们希望自己的组件不依赖于某个具体的日志工具,毕竟有很多日志工具可以使用。例如,假如Log4j日志工具存在性能或者其他问题,我们就需要对日志工具进行切换。但是如果我们的应用程序是直接使用的Log4j,在切换时会带来大量的修改工作。为了解决这个问题,日志系统采用了门面模式

门面模式:提供一个统一的接口去访问多个子系统的多个不同接口,它为子系统中的一组接口提供一个统一的高层接口。

具体说来,Apache Commons Logging和Slf4j提供通用的日志API,充当门面角色;门面后面才是Log4j、Log4j2和LogBack等具体的实现。有人也将Apache Commons Logging和Slf4j称为日志框架。

日志框架仅仅提供日志接口,而具体的日志实现则在运行时根据配置,动态地决定具体使用哪个日志系统,也就是说,具体的日志实现交给Log4j这样的开源日志工具来完成。开发人员只需要针对API进行编程,而运行时可以根据配置切换不同的日志实现。这种方式将我们的应用程序和具体的日志实现进行了解耦,底层日志系统的改变,并不会影响上层的业务代码,大大提高了灵活性。

3. 开源日志系统

sun公司为了抗衡Log4j,在JDK1.4推出了一套日志系统JDK Logger,它的最大优点是不需要继承任何类库,只要有Jre环境,就可以直接使用。但是相比其他开源日志框架,JDK Logger在易用性、功能、扩展性方面都稍逊一筹,被人诟病,所以使用较少。

Java日志系统(下)中,具体介绍常见的开源日志系统。

猜你喜欢

转载自www.cnblogs.com/jfzhzo/p/9656094.html
今日推荐