java日志相关架构

1 篇文章 0 订阅
1 篇文章 0 订阅
    1. 先看一下专业术语
      Facade:点击打开链接
    2. 要想理解某个东西,必须要了解这个东西的历史,首先大致介绍历史
             最先出现的是apache的log4j,当时这个日志是应用最广泛的日志工具,成为标杆
             有了标杆,就有了追赶者,Sun公司在jdk1.4中加入JUL日志实现,就是jdk自带的java.util.logging
             由于两方面不像utf字符编码创建者和UCS编码那样和谐供出了,两方面一直在较量,没有关联,造成了混乱
             紧接着,jcl(Jakarta Commons Logging或者Apache Commons logging)出现了,这个日志框架,既兼容了之前主流的日志实现,也有自己的日志实现,基本上一统江湖了,但是仍然有很多冲突。spring也依赖了jcl
             后来slf4j(simple logging facade for java)横空出世,slf4j就是log4j的作者进一步开发出来的,他觉得jcl不够好,slf4j这不是具体的日志解决方案,只服务于各种各样的日志系统,也就是提供接口,不影响用户最终选择哪种日志系统,比较适合灵活切换日志系统,此时此刻,兼容了主流的日志实现,这个时候市场上比较好兼容处理了,并且slf4j有了自己的日志实现,但是名字不像之前的各种日志框架都名字一样, 而是叫logback,logback是比较好用的日志实现。
    3. 学完了各种历史,来看看目前主流的这个日志体系结构图
      这个图只是大体上的体系,日志接口层都用slf4j都有利于简化处理
    4. slf4j是java的简单日志门面,不是具体的日志解决方案,只服务于各种各样的slf4j-log的日志系统,log就是包括主流的四种日志实现层方式,java.util.logging,logback,log4j,common-logging,slf4j是一个用于日志的简单Facade(门面设计模式)


    5. 在接口桥接器和实现桥接器中,是不需要在代码中或者配置文件中指定的,只需要在项目中加入指定的log-slf4j-log包即可,但是日志的是需要配置文件的,这个与IOC思想有点类似

    接口桥接器

    jul-to-slf4j:jdk-logging到slf4j的桥梁
    log4j-over-slf4j:log4j1到slf4j的桥梁
    jcl-over-slf4j:commons-logging到slf4j的桥梁
    举例:比如使用log4j的API进行编程,但最终用logback来进行输出,所以就需要先将log4j1的日志输出转交给slf4j来输出,slf4j再交给logback来输出。这就是log4j-over-slf4j做的事

    实现桥接器

    slf4j-jdk14:slf4j到jdk-logging
    slf4j-log4j12:slf4j到log4j1
    log4j-slf4j-impl:slf4j到log4j2
    logback-classic:slf4j到logback
    slf4j-jcl:slf4j到commons-logging


     
    业务访问层,通常都是已经存在的日志输出
        接口桥接器
    slf4j-api(接口层)     
    各日志实现包的连接层,桥接层( slf4j-jdk14, slf4j-log4j) 

       各日志实现包 

    • 现在举一个例子,之前你的日志实现是jcl,现在想要给转化为logback,你应该怎么做呢
    • 需要导入jcl-over-slf4j-1.6.2jar包,用于桥接commons-logging到slf4j,如果是logback到slf4j,都不用引桥接器的
    • 需要导入slf4j这个日志转化系统,就是slf4j-api-1.5.11.jar
    • 需要导入实现桥接器,也就是各日志实现包的连接层,slf4j-log4j12-1.5.11.jar,这里还需要做一个路径上的配置,这个是maven里面导入jar包的依赖
    • 需要在maven的pom.xml文件中加入logback对应的jar包,logback-core-0.9.29.jar,logback-classic-0.9.29.jar,(这里有注意的,导入其他的包里面经常是包含logback或者其他日志实现的包,这里应该要将其排除掉,防止会起冲突)
    • 最后要将你的logback.xml配置好,logback会一次读取logback.groovy,logback-test.xml,logback.xml(logback.xml与logback.groovy之间可以互相转化,logback.groovy转化成logback.xml 点击打开链接
    • 参考: logback.xml文件详细说明 点击打开链接 https://my.oschina.net/looly/blog/298675
    • 参考: logback配置的详细说明 点击打开链接 http://www.cnblogs.com/warking/p/5710303.html
    • pom.xml文件配置参考:
    • <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
      </dependency>
      <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
      </dependency>
      <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
      </dependency>

    • <dependency>
          <groupId>abc.common</groupId>
          <artifactId>common-rpc</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>org.slf4j</groupId>
                  <artifactId>jcl-over-slf4j</artifactId>
              </exclusion>
              <exclusion>
                  <groupId>org.slf4j</groupId>
                  <artifactId>log4j-over-slf4j</artifactId>       //比如这里需要排除掉其他的桥接器jar包
              </exclusion>
              <exclusion>
                  <groupId>ch.qos.logback</groupId>
                  <artifactId>logback-classic</artifactId>         //排除掉其他的logback实现的jar包,应该版本可能要求不一样
              </exclusion>
          </exclusions>
      </dependency>

    • 但是一直会有一个问题值得注意
    • 就是slf4j是的作用是桥接转化两个不同的日志实现方案,因此转化两个相同的日志实现方法,就会出现死循环,发生冲突
    • jcl-over-slf4j 与 slf4j-jcl 冲突,log4j-over-slf4j 与 slf4j-log4j12 冲突 ,jul-to-slf4j 与 slf4j-jdk14 冲突,而且从slf4j到slf4j以及slf4j到logback是不需要桥接的,但是logback.xml的配置文件是需要有的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值