作为Java开发人员,对于日志记录框架一定非常熟悉。而且几乎在所有应用里面,一定会用到各种各样的日志框架用来记录程序的运行信息。而对于一个成熟的Java应用,这个是必不可少的。在开发和调试阶段,日志可以帮助我们更快的定位问题;而在应用的运维过程中,日志系统又可以帮助我们记录大部分的异常信息,通常很多企业会通过收集日志信息来对系统的运行状态进行实时监控预警。
总体概览
目前的日志框架有JDK自带的logging
,log4j1
、log4j2
、logback
,这些框架都自己定制了日志 API ,并且有相应的实现;目前用于实现日志统一的框架 Apache commons-logging
、slf4j
,遵循面向接口编程的原则,这两大框架可以让用户在程序运行期间去选择具体的日志实现系统(log4j1\log4j2\logback
等)来记录日志,是统一抽象出来的一些接口。
日志级别
log4j
定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),
优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
ALL
最低等级的,用于打开所有日志记录。
TRACE
很低的日志级别,一般不会使用。
DEBUG
指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
INFO
消息在粗粒度级别上突出强调应用程序的运行过程。这个可以用于生产环境中输出程序运行的一些重要信息。
WARN
表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给开发者的一些提示。
ERROR
指出发生错误的信息,可能会导致系统出错或是宕机等,必须要避免
FATAL
指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
OFF
最高等级,用于关闭所有日志记录。
Log4j
官网地址:https://logging.apache.org/log4j/1.2/
简介:
Apache 的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。
在JDK 1.3及以前,Java打日志依赖System.out.println()
, System.err.println()
或者e.printStackTrace()
,Debug日志被写到STDOUT
流,错误日志被写到STDERR
流。这样打日志有一个非常大的缺陷,即无法定制化,且日志粒度不够细。log4j是在这样的环境下诞生的,它是一个里程碑式的框架,它定义的Logger
、Appender
、Level
等概念如今已经被广泛使用。
在https://mvnrepository.com/中可以查到,log4j1从2005年11月更新到2012年3月,后面就没再更新了
最新的依赖(May 26, 2012)
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2015年8月5日,项目管理委员会宣布Log4j 1.x
已达到使用寿命。建议用户使用Log4j 1
升级到Apache Log4j 2
Log4j2
官网地址:https://logging.apache.org/log4j/2.x/
Log4j2
是Log4j1
的升级版本。Log4j2
基本上把Log4j1
版本的核心全部重构掉了,而且基于Log4j1
做了很多优化和改变。并提供了Logback
中可用的许多改进,同时修复了Logback
架构中的一些固有问题。
Log4j2最新的依赖(Mar 11, 2018)
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>
SpringBoot也有Log4j2相关的依赖
不过SpringBoot
自带的jar
包已经够用了
引入依赖(Jun 14, 2018)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
引入之后可以看到外部jar包多了三个关于log4j2的
关于上面的包
log4j-to-slf4j
将log4j2
的接口适配到slf4j
上,不能和log4j-slf4j-impl
同时存在
log4j-api
包含.class
但是只是一堆接口而已,实际使用需要log4j
log4j-core
包含.class
与.java
也就是源码
jul
指的是java.util.logging
,是 java
内置的日志模块
简介:受Log4j
启发,Sun在Java1.4
版本中引入了java.util.logging
,但是jul
功能远不如log4j
完善,开发者需要自己编写Appenders
(Sun称