java日志框架简介(日志框架选型)
目录
日志框架发展历程
实现框架
log4j1
JUL
logback
log4j2
门面日志
SLF4J
JCL
Spring-JCL
Jboss-logging
日志框架选型
日志框架发展历程
现在,java日志框架分为实现类和门面类。
实现框架
常见的日志输出框架有:log4j1,log4j2,logback,JUL等。
log4j1
log4j1(又叫log4j)是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。当前已经停止维护,不建议使用。
JUL
JUL是JDK自带的一个日志实现,java.util.logging包下的各个类提供了原生的日志记录和输出支持。
未配置JUL配置文件时,JUL的日志将输到控制台。如果需要转换到slf4j/log4j,除了要使用桥接包外,还必须正确地初始化jul桥接包(因为JUL由jdk携带,无法排除,不初始化桥接包,就不会转到其它日志框架输出),初始化方式参见下文桥接包说明。
logback
Logback,一个“可靠、通用、快速而又灵活的Java日志框架”。Logback当前分成三个模块:logback-core,logback- classic和logback-access。
logback-core:是logback的核心模块。
logback- classic:logback的日志实现,同时实现了slf4j。
logback-access:与servlet容器(如Tomcat和Jetty)集成,以提供记录HTTP访问日志。
log4j2
Apache Log4j2是Log4j的升级,对其前身Log4j1进行了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。注意:log4j2与log4j1相互不兼容(但log4j2提供了桥接包,可以将log4j1桥接到log4j2)。
log4j2核心包 | |
log4j-api | log4j2核心包,api接口。当使用log4j2输出日志时,必须提供此包。 |
log4j-core | log4j2日志输出包。实现log4j2日志输出功能。当使用log4j2输出日志时,必须提供此包。 |
各日志框架桥接到log4j2输出日志 | |
log4j-1.2-api |
log4j1日志api桥接到log4j2,使用log4j2 api输出日志。 引入此包后,不需要再引入log4j1包,使用了log4j1的api代码不会出错。 |
log4j-jcl |
JCL日志api桥接到log4j2包(在META-INF配置文件中指定了jcl 日志的实现工厂)。 引入此包后时,必须引入JCL API包。 |
log4j-jul |
JUL日志api桥接到log4j2包。 将JUL转换成log4j2日志输出。 使用此包时,必须在使用jul相关api之前设置参数:java.util.logging.manager为org.apache.logging.log4j.jul.LogManager,例如: 虚拟机参数:-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager 或代码设置:System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager") |
log4j-slf4j-impl |
slf4j 1.7桥接到log4j2包。 使用此包后,使用slf4j api的日志输出将使用log4j2打印日志。 此包对应slf4j 1.7(包含)以下版本。 选择此包时,需要同时选择slf4j-api。 |
log4j-slf4j18-impl |
slf4j 1.8桥接到log4j2包。 使用此包后,使用slf4j api的日志输出将使用log4j2打印日志。 此包对应slf4j 1.8(包含)以上版本。slf4j 1.7不能使用此包。 选择此包时,需要同时选择slf4j-api。 |
log4j2桥接到其它日志框架包 | |
log4j-to-slf4j |
log4j2桥接到slf4j包。 使用此包后,log4j2 api的日志输出将使用slf4j api打印日志。 选择此包时,需要同时选择log4j-api,不能选择log4j-core |
门面日志
常见的门面日志框架有:slf4j,jcl(Apache Commons Logging),Spring-JCL,jboss-logging等。
SLF4J
Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,以外观模式实现。可以在软件部署的时候决定要使用的 Logging 框架,目前主要支持的有Java Logging API、Log4j2及logback等框架。
SLF4J只是一个门面服务而已,他并不是真正的日志框架,真正的日志的输出相关的实现还是要依赖其背后的日志实现Log4j2、logback等日志框架的,具体信息见下图。
由上图可以看到 slf4j 几乎可以使用所有的具体日志框架,图中颜色意义如下:
绿色的 application:应用层,向下可直接调用 slf4j 提供的 API
浅蓝色的 abstract logging api:抽象 API 层
深蓝色的 native implementation of slf4j-api:具体日志框架实现层,不需要适配器,本身已经实现了 slf4j-api
湖蓝色的 adaptation layer:适配层,也就是桥接器
灰色的 non-native implementation of slf4j-api:具体日志框架实现层,本身没有实现 slf4j-api,需要桥接器。
具体包jar包说明如下
jar包 | jar包作用 | 说明 |
slf4j核心包 | ||
slf4j-api | sfl4j核心包,api | 使用slf4j框架时,必须包 |
将各种日志桥接到slf4j输出包: | ||
jcl-over-slf4j |
将jcl桥接到sl4j,使用此包后,不需要引入JCL API,Spring JCL包。 |
使用其它日志框架api转换为slf4j实现。 即其它框架api打日志时,将调用slf4输出日志。 使用这部分包时,原来的日志框架api可以不再依赖。 |
jul-to-slf4j |
将jul桥接到slf4j。 相关类由JDK提供,我们不能排除掉JDK,因此引入jar包后,需要调用以下代码,才会生效(或使用其它方式): SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); |
|
log4j-over-slf4j |
将log4j1桥接到sfl4j。 使用此包后,使用log4j1 api的日志输出将使用slf4j打印日志。引用此包后不需要引入log4j1的jar包。 |
|
将slf4j桥接到其它日志框架输出 | ||
slf4j-jcl | 将slf4j转换成jcl输出日志 |
将sfl4j转换成其它日志。即当使用sfl4j api打日志时,将调用其它日志框架输出日志。 当使用这几个jar包时,需要对应的日志框架api和实现。 |
slf4j-jdk14 | 将slf4j转换成jul输出日志。 | |
slf4j-log4j12 slf4j-reload4j |
将slf4j转换成log4j1输出日志。 slf4j-reload4j:新的包,替代slf4j-log4j12。 log4j1已经停止维护,不建议再使用 |
|
slf4j默认实现包 | ||
slf4j-nop | 当使用slf4j api打日志时,无日志输出 | |
slf4j-simple | 当使用slf4j-api打日志时,直接控制台输出 |
log4j-slf4j-impl |
slf4j 1.7桥接到log4j2包。 使用此包后,使用slf4j api的日志输出将使用log4j2打印日志。 此包对应slf4j 1.7(包含)以下版本。 选择此包时,需要同时选择slf4j-api。 |
由log4j2发布,版本号与log4j2一样 |
log4j-slf4j18-impl |
slf4j 1.8桥接到log4j2包。 使用此包后,使用slf4j api的日志输出将使用log4j2打印日志。 此包对应slf4j 1.8(包含)以上版本。slf4j 1.7不能使用此包。 选择此包时,需要同时选择slf4j-api。 |
|
log4j-to-slf4j |
log4j2桥接到slf4j包。 使用此包后,log4j2 api的日志输出将使用slf4j打印日志。 选择此包时,需要同时选择log4j-api,不能选择log4j-core |
slf4j jar包冲突
如果选择了同一种框架桥接到->slf4j的日志输出时,就不能再选择sfl4j转换到此框架的转换包,否则将造成循环调用(其它日志框架slf4j),如下图:
调用 slf4j 的 API 接口,然后 slf4j 将请求转发给 slf4j-log4j12,使用log4j1来输出日志,log4j1日志请求会重新打回给 slf4j,从而形成一个死循环。
JCL
JCL全名叫Apache Commons Logging(原名 Jakarta Commons Logging,JCL)是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型。它通过其他一些工具提供API,日志实现和包装器实现。目前已经停止更新(可以使用spring jcl替代)。
commons-logging和SLF4J的功能是类似的,主要是用来做日志门面的。
JCL会自动寻找合适的日志框架输出日志。
依次自动寻找:log4j1(只支持logj1,不支持log4j2),JDK14(JUL),Jdk13Lumberjack,SimpleLog(直接打在控制台)。
如果要让JCL使用log4j2/slf4j输出日志,一定要使用jcl到log4j2/slf4j的桥接包,也可以选择使用Spring JCL或其它JCL桥接器替代JCL。
Spring-JCL
由于目前Apache JCL已经停止维护,所以从Spring 5.0开始,它提供了spring版本的JCL,对外API与Apache JCL一样。
他会依次自动寻找:log4j2(如果是log4j2->slf4j桥接包中的api,则直接使用slf4j),slf4,jul日志框架记录日志(谁先找到就用谁)。
Spring JCL可以完全替换Apache JCL。jcl-over-slf4j也可以完全替代Apache JCL。两个包只需要二远一即可。有了Spring JCL/jcl-over-slf4j包的工程,可以完全排除Apache JCL。
Jboss-logging
jsobb-logging是一款类似slf4j的门面日志框架,一般主要用于hibernate中。
它会自动寻找:JBoss LogManager(主要在 WildFly 应用服务器内部使用),Log4j2,log4j1,JUL日志框架记录日志(谁先找到就用谁)。
因jboss能自动适配log4j2,因此当log4j2/log4j1作为实现时日志输出时,可以不需要转换;否则,会自动匹配JUL输出日志,如果未配置JUL作为日志实现时,需要将JUL转换到其它日志输出,否则会直接打在控制台。
日志框架选型
一般说来,在代码中都直接使用门面日志框架来记录日志。再组合各转换桥接包输出日志。
常用的就是使用slf4j,其它各框架都将转换成slf4j输出日志,再由slf4j调用真实的日志输出包。
因此这里只列出slf4j作为日志框架的jar包选择。
必选包:slf4j-api | ||||
可选包:XXX-to-slf4j,XXX-over-slf4j。 根据代码或第3方jar包的需要,选择合适的桥接器,将相应的日志框架输转换到slf4j输出日志。 |
||||
真实日志输出包(必须选择一个): slf4j+logback:logback-core,logback- classic。 log4j2:log4j-api、log4j-core、log4j-slf4j-impl或log4j-slf4j18-impl。注意此时不能再选择log4j-to-slf4j包,否则会死循环。 log4j1:log4j-1.2.X.jar、slf4j-log4j12-X.jar。目前log4j2已经停止发布,不建议选择。 JCL:JCL包,slf4j-jcl-X.jar。注意此时不能再选择jcl-over-slf4j包,否则会死循环。 JUL:slf4j-jul-X.jar。注意此时不能再选择jul-to-slf4j包,否则会死循环。 |
如下图所示:
图中展示了能安全地从别的日志框架 API 转调回 slf4j 的三种情形。要想实现转调,方法就是图上列出的用特定的桥接器 jar 替换掉原有的日志框架 jar。
java日志框架简介(日志框架选型)相关推荐
- java风清扬简介_Spring 框架简介
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...
- freecplus框架简介
文章目录 一.freecplus框架简介 二.freecplus开源许可协议 三.freecplus框架内容 字符串操作 2.xml解析 3.日期时间 4.目录操作 5.文件操作 6.日志文件 7.参 ...
- 01、freecplus框架简介
文章目录 一.freecplus框架简介 二.freecplus开源许可协议 三.freecplus框架内容 字符串操作 2.xml解析 3.日期时间 4.目录操作 5.文件操作 6.日志文件 7.参 ...
- java executor解读_Java-多线程框架Executor解读
概述 在Java中,使用线程来异步执行任务.Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源.同时,为每一个任务创建一个新线程 ...
- Mybatis框架简介
一.Mybatis框架简介 MyBatis框架是一个开源的数据持久层框架.它的内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询.存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工 ...
- Django框架简介
Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...
- java多线程之Executor框架
Executor框架简介 Executor框架的结构 Executor框架主要由3大部分组成: 任务: 包括被执行的任务需要实现的接口:Runable 接口.Callable接口: 任务的执行: 包括 ...
- hdwiki 框架简介
虽然HDwiki是一个开源的wiki系统,并且代码简洁易懂,但如果想在系统上做做进一步开发还需要对框架有一个整体的认识.熟悉了HDwiki的框架以后完全可以独立出来做其他功能的开发,当做一个开源的PH ...
- Twisted 框架简介
Twisted 框架简介 Twisted 框架介绍 创建Twisted Reactor TCP 服务器 创建Twisted Reactor TCP 客户端 Twisted 框架介绍 Twisted 是 ...
- spring mvc框架、mvc框架模式
框架与框架模式 框架模式:解决某一类问题的思维模式方法论 框架:在框架模式方法论之上实现的一套成熟的一组组件,供选用完成自己的系统 MVC:全称Model-View-Controller是模型-视图- ...
最新文章
- 最温暖的大学,最火热的比赛
- lt li gt html,lt;ligt;...这个符号什么意思,放在中间有什么作用?
- 所谓完整的linux系统包括哪些部分呢?【转】
- python连接池框架_python pymysql 连接池
- [Vue源码分析]自定义事件原理及事件总线的实现
- docker如何部署python项目_Docker如何部署Python项目的实现详解
- 工作流实战_08_flowable 流程实例的启动
- ubuntu防火墙操作
- Leetcode-204 Count Primes
- 最常用的 Linux 命令汇总,以后总会用到的
- [msi]Cannot open database file. System error -2147287035
- 【转】C#中base关键字的几种用法
- 【译】成为明星数据科学家的13大技能
- java画图类_JAVA绘图类_Graphics
- Kaggle竞赛:Quora Insincere Questions Classification 总结与心得感想
- HTML-零基础入门
- 手机银行消息服务器,服务与功能_手机银行_服务介绍_个人电子银行_电子银行频道_建设银行...
- 马上大四了,秋招还是春招好?先找工作还是找实习
- 菜鸟笔记-微信分享突然失效的解决
- 基于skynet设计游戏服务端框架
热门文章
- C# 控制投影仪投影图片
- 任正非华为手机不用鸿蒙,任正非说鸿蒙媲美iOS不用三年,华为若出鸿蒙手机你会买吗?...
- 到底企业招人是更看重学历,还是能力呢?
- 笔记本电脑怎样运行PHP,笔记本电脑输入法怎么设置
- 你身边有没有完全靠炒股发家致富,养家糊口的?
- UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xfc in position 8: invalid start byte
- 一眼看懂promise与async await的区别
- Python使用Pygal可视化GitHub仓库排名
- word中公式编号格式
- C++ 中的分号 语句块