本系列日志文章主要是针对项目上遇到的日志问题,发散下思维,比较广的介绍下java中常见以及常用的日志框架,并通过实例代码演示。系列文章主要分为三大部分:
- 了解日志的作用,了解java中常用的日志框架;
- 不同日志框架的比较,实际项目中如何选取;
- 具体项目中日志的使用
本篇先描述第一个问题,什么是日志,常用的日志框架有哪些?
日志名称 | 日志含义 | 级别级数 |
---|---|---|
Debug | 级别最低的日志,开发人员用于测试、验证常用的日志级别,在开发阶段经常使用 | level_1 |
Info | Info信息是应用信息,生产环境上的日志级别都是info,通常打印的是一些关键节点的日志,能够根据这些日志”检索”出用户的行为路径 | level_2 |
Warn | 告警日志,非错误性日志,意味着当前的业务逻辑流程存在不合理的处理,但是也属于正常的结果,不影响正常的业务流程,可以不修复 | Level_3 |
Error | 错误性的日志,此日志的出现意味着有错误的业务流程代码出现问题,而且必须得修复 | Level_4 |
如上表1所述一般而言,测试环境下开发用于调试,日志配置文件为debug级别,为了不进行繁琐的日志级别变更,线上的日志配置文件级别又都设置为了info,这样,开发者在代码中可以根据需要使用日志级别,并且在不同的环境上打印不同的日志。
几种常见的日志
- Log4j:是最早的日志框架,是apach旗下的;
- Log4j2:apach旗下的关于log4j的升级版;
- Logback:是基于slf4j接口实现的一套日志框架组件;
- JUL(java utillog):仿log4j实现的日志框架,是sun旗下的,(也就是在我们普遍使用的jdk中);
- Commons loggin:是一套日志接口;
- Slf4j:也是一套日志接口;
Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)。log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用这只需要关注接口而无需关注具体的实现,做到解耦;
比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。
如下所示图1和图2分别为log4j2、logback日志框架实现slf4j接口
log4j2与slf4j的结合
logback与slf4j的结合
如下为commons logging的框架实现,在其内部基于接口Log实现了了jdk自带的log以及log4j的log,使用的时候“Log logger = LogFactory.getLog(App.class.getName())”,用户根本不知道调用的是哪一个log,当用户没有添加log4j的相关日志依赖的时候,实际上使用的是JDK自带的log,当用户添加了log4j相关的日志依赖,并且配置好了log4j.xml以及web.xml文件时,实际上使用的是log4j的log。
commons logging接口实现