`
zy19982004
  • 浏览: 654364 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:249881
社区版块
存档分类
最新评论

Java日志学习六:各种日志系统间的桥接

 
阅读更多

一.四种日志系统

  1. JCL http://zy19982004.iteye.com/blog/1991328
  2. Apache Log4j http://zy19982004.iteye.com/blog/1992939
  3. Slf4j http://zy19982004.iteye.com/blog/1993059
  4. JDK Logger http://zy19982004.iteye.com/blog/1993209

二.为什么会有桥接

     除了JDK Logger是一个纯粹的日志实现之外,其它三个日志系统都是api+impl的形式。每个人都想去做门面,让别的厂商做实现。结果呢,做是做到了。但相比JDBC由sun提供的一套接口,日志系统显得极为混乱。有多少人知道自己的Logger LOG = XX.getLogger(class)到底是哪个Logger?有多少系统里混合着几种日志系统?本文将一一为你解答。

<!--JCL-->
<dependency>   
	<groupId>commons-logging</groupId>    
	<artifactId>commons-logging-api</artifactId>    
	<version>1.1</version>    
</dependency> 
<dependency>  
	<groupId>commons-logging</groupId>   
	<artifactId>commons-logging</artifactId>   
	<version>1.1.1</version>   
</dependency>

<!--Log4j-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.0-beta9</version>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>

<!--Slf4j-->
<dependency> 
	<groupId>org.slf4j</groupId> 
	<artifactId>slf4j-api</artifactId> 
	<version>1.7.5</version> 
</dependency> 
<dependency> 
	<groupId>org.slf4j</groupId> 
	<artifactId>slf4j-simple</artifactId> 
	<version>1.7.5</version> 
</dependency>

 

三.使用JDK Logger

      这个比较简单,pom里什么都不用做,代码里Logger logger = Logger.getLogger(JavaLoggerTest.class.getName())即可。

 

四.使用JCL做门面,其它日志系统做实现(含JCL自身实现)

     http://zy19982004.iteye.com/blog/1991328已经将了JCL寻找日志实现的方式。

  1. JCL做门面,JCL做实现:pom里只需
    <dependency>  
    	<groupId>commons-logging</groupId>   
    	<artifactId>commons-logging</artifactId>   
    	<version>1.1.1</version>   
    </dependency>
    
    
     
  2. JCL做门面,Log4j做实现,也好说,因为JCL和Log4j都是Apache自家的东西,所以JCL api里已经预留了Log4j的实现,我们只需要把Log4j加到系统里即可,pom如下。为什么是commons-logging不是commons-logging-api也请参考http://zy19982004.iteye.com/blog/1991328
    <dependency>  
    	<groupId>commons-logging</groupId>   
    	<artifactId>commons-logging</artifactId>   
    	<version>1.1.1</version>   
    </dependency>
    <dependency>
    	<groupId>log4j</groupId>
    	<artifactId>log4j</artifactId>
    	<version>1.2.17</version>
    </dependency>
     
  3. JCL做门面,Slf4j做实现。可惜的是,JCL并没有内置Slf4j的实现,只能通过service机制,Slf4j里定义一个org.apache.commons.logging.LogFactory的实现类。jcl-over-slf4j就是桥接器,SLF4JLog实现JCL的Log接口,由Slf4j的Logger去实现;SLF4JLogFactory实现JCL的LogFactory,由Slf4j的LoggerFactory去实现。所以jcl-over-slf4j依赖slf4j-api。剩下的就是Slf4j决定采用哪种实现了,比喻slf4j-simple。最后pom文件如下。
    <dependency>   
    	<groupId>commons-logging</groupId>    
    	<artifactId>commons-logging-api</artifactId>    
    	<version>1.1</version>    
    </dependency>
    <dependency>  
    	<groupId>org.slf4j</groupId>  
    	<artifactId>jcl-over-slf4j</artifactId>  
    	<version>1.7.5</version>  
    </dependency>
    
    //可定制
    <dependency> 
    	<groupId>org.slf4j</groupId> 
    	<artifactId>slf4j-simple</artifactId> 
    	<version>1.7.5</version> 
    </dependency> 
       
  4. JCL做门面,JDK Logger做实现。只需加入commons-logging-api即可。pom如下
    <dependency>   
    	<groupId>commons-logging</groupId>    
    	<artifactId>commons-logging-api</artifactId>    
    	<version>1.1</version>    
    </dependency> 
     

 

五.使用Slf4j做门面,其它日志系统做实现(含Slf4j自身实现)

  1. Slf4j做门面,自身做实现。只需加入slf-api和slf-simple即可。pom如下
    <dependency> 
    	<groupId>org.slf4j</groupId> 
    	<artifactId>slf4j-api</artifactId> 
    	<version>1.7.5</version> 
    </dependency> 
    <dependency> 
    	<groupId>org.slf4j</groupId> 
    	<artifactId>slf4j-simple</artifactId> 
    	<version>1.7.5</version> 
    </dependency>
     
  2. Slf4j做门面,JCL做实现。需要slf4j-jcl做桥接器,slf4j-jcl已经依赖commons-logging了,所以我们不需要了。需要注意的是jcl-over-slf4j和slf4j-jcl不能同时出现在系统里,slf4j会检查这种循环调用最后抛出Detected both jcl-over-slf4j.jar AND slf4j-jcl.jar on the class path。这几种日志系统的桥接器在一起还有有其它的循环,使用时注意就行了。最后pom如下
    <dependency> 
    	<groupId>org.slf4j</groupId> 
    	<artifactId>slf4j-api</artifactId> 
    	<version>1.7.5</version> 
    </dependency> 
    <dependency>  
    	<groupId>org.slf4j</groupId>  
    	<artifactId>slf4j-jcl</artifactId>  
    	<version>1.7.5</version>  
    </dependency>  
     
  3. Slf4j做门面,Log4j做实现。和上面一个道理。需要桥接器slf4j-log4j12。http://zy19982004.iteye.com/blog/1993059 里已经将到了slf4j-log4j12是怎么工作的,因为slf4j-log4j12 pom里已经依赖log4j,所以我们不需要了。最后pom如下
    <dependency> 
    	<groupId>org.slf4j</groupId> 
    	<artifactId>slf4j-api</artifactId> 
    	<version>1.7.5</version> 
    </dependency> 
    
    <dependency>  
    	<groupId>org.slf4j</groupId>  
    	<artifactId>slf4j-log4j12</artifactId>  
    	<version>1.7.5</version>  
    </dependency> 
     
  4. Slf4j做门面,JDK Logger做实现。好像没有发现这个桥接器,写起来也简单,参考http://zy19982004.iteye.com/blog/1993059定义自己的日志实现。

六.使用Log4j做门面,其它日志系统做实现(含Log4j自身实现)

 

      相比JCL做门面,动态查找实现和Slf4j做门面,静态绑定实现,Log4j的门面,其它日志做实现,相关桥接器的代码我没细过,大概扫了一眼,只是纯粹意义上的接口和实现的关系。包装一下别人的东西,没撒意思。

  1.  Log4j做门面,Log4j做实现。只需要log4j,pom如下
    <dependency>
    	<groupId>log4j</groupId>
    	<artifactId>log4j</artifactId>
    	<version>1.2.17</version>
    </dependency>
     
  2. Log4j做门面,JCL做实现。使用log4j-jcl做桥接器。log4j-jcl已经依赖log4j-api和commons-logging,所以我们不需要了,pom如下
     <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.0-beta9</version>
     </dependency>
     
  3. Log4j做门面,Slf4j做实现。log4j-to-slf4j已经依赖log4j-api和slf4j-api,我们不再需要了。pom如下
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.0-beta9</version>
     </dependency>
    <dependency> 
    	<groupId>org.slf4j</groupId> 
    	<artifactId>slf4j-simple</artifactId> 
    	<version>1.7.5</version> 
    </dependency>
     
  4. Log4j做门面,JDK Logger做实现。没有发现这个桥接器,也没必要。 

 

 

1
0
分享到:
评论

相关推荐

    java代码实例-日志规范史上最全java日志攻略(附教程)

    日志框架 JAVA中现有的日志框架 JUL "JUL入门使用 日志的级别 Appender的介绍 日志的布局和格式" Log4J "Log4J的入门使用 Log4j的配置 输出日志文件 将日志信息存入数据库" Apache JCL "common log介绍 log中的接口...

    java日志框架视频教程

    桥接旧日志实现4. 原理解析章节六:Logback1. 快速入门2. 配置文件3. logback-access使用章节七:Log4j21. 快速入门2. 配置文件3. 异步日志4. 性能介绍章节八:SpringBoot使用日志1. springBoot日志设计2. ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    面向对象第一次作业

    用所学的模式设计一个日志系统,日志(接口或抽象类)有打开日志open()、写日志write()、显示日志display()和关闭日志close()方法。日志存储方式(具体实现)有文件、MySQL数据库、MS SQL2005、Acess数据库、JavaDB...

    日志技术 (下)1

    1. 日志门面和日志体系 5. SpringBoot中的日志使用 1. 日志门面 1. 添加依赖 1. 日志框架的绑定 2. 日志框架的桥接 2. 编写代码 2

    design-pattern-forjava.zip

    design-pattern-forjava 基于java版的设计模式实现。 1,抽象工厂模式,提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类. 2,适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter...

    深入浅出设计模式(中文版电子版)

    3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6优势和缺陷 93 3.6.7应用情景 93 第4章GoF-StructuralDesignPatterns结构型设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1...

    深入浅出设计模式(中文版)

    3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6优势和缺陷 93 3.6.7应用情景 93 第4章GoF-StructuralDesignPatterns结构型设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1...

    《设计模式实训教程》【PPT+类图与代码+样章】

    1.2.1类图实例之图书管理系统 1.2.2类图实例之商场会员管理系统 1.3实训练习 第2章面向对象设计原则实训 2.1知识讲解 2.1.1面向对象设计原则概述 2.1.2单一职责原则 2.1.3开闭原则 2.1.4里氏代换原则 2.1.5...

    eclipse-git-extensions:通过命令行Git启动来扩展eclipse git支持,以实现jgitegit不支持的功能,

    SVN桥接:从SVN拉取提交; 推送提交到SVN; 从SVN获取提交; SVN信息; ref-&gt; SVN修订版; SVN转速-&gt; SHA 二等分:开始(可选的错误和良好提交); 标记为好; 不好跑分跳过; 日志(可选文件); 重播; 重启 合并...

    asp.net知识库

    C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件...

    liquibase-slf4j:Liquibase SLF4J记录仪

    Liquibase有一个委托给java.util.logging的日志记录机制。 如果您使用jul-to-slf4j库,它就可以很好地与SLF4J配合使用。 不幸的是,将java.util.logging桥接到SLF4J已知的。 该库通过直接将Liquibase登录到SLF4J来...

    ProjectE-Aether-Addon

    ProjectE Aether Addon的存储库,该模块添加了可桥接ProjectE和Aether 2的新内容。该模块当前处于早期内容状态,请随时在拉取请求和功能请求问题中提出新内容。 此mod可以作为modpack的一部分重新分发,允许公共和...

    informix-backup-ibm-cos:捕获Informix备份STDIO并将其流传输到IBM Cloud Object Storage的实用程序

    该实用程序充分利用了Informix的STDIO功能的备份和还原(BAR)功能,并提供了到IBM Cloud Object Storage的无缝桥接。 日志文件和数据文件都可以配置为进行备份和还原操作。 可以完全支持Informix备份和还原功能,...

    软件框架设计的艺术

    15.4 相似API的桥接和共存 274 第16章 团队协作 286 16.1 在提交代码时进行代码评审 286 16.2 说服开发人员为他们的API提供文档 290 16.3 尽职尽责的监控者 292 16.4 接受API的补丁 297 第17章 ...

    Martian-Server:Martian-Server 是一个基于AIO的网络编程包,支持http,websocket等协议【暂时只支持http】

    基于AIO的网络编程包项目...-- 这个是日志包,支持任意可以跟slf4j桥接的包 --&gt;&lt;dependency&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-jdk14&lt;/artifactId&gt; &lt;version&gt;1.7.12&lt;/version&gt;&lt;/dependency&gt;二、创建H

    Martian-server

    基于AIO的网络编程包 项目简介 ...安装步骤 一、导入依赖 ... &lt;artifactId&gt;Martian-server ...-- 这个是日志包,支持任意可以跟slf4j桥接的包 --&gt; &lt;groupId&gt;org.slf4j &lt;artifactId&gt;slf4j-jdk14 &lt;version&gt;1.7.12 二

Global site tag (gtag.js) - Google Analytics