zoukankan      html  css  js  c++  java
  • 关于java的日志框架

      

    Log4j

      Log4j是Apache的一个开放源代码项目,Spring Boot1.4以及之后的版本已经不支持log4j ,log4j也很久没有更新了,现在已经有很多其他的日志框架对Log4j进行了改良,比如说SLF4J、Logback等。

    Log4j2

      而且Log4j 2在各个方面都与Logback非常相似,那么为什么我们还需要Log4j 2呢

           1. 插件式结构。Log4j 2支持插件式结构。我们可以根据自己的需要自行扩展Log4j 2. 我们可以实现自己的appender、logger、filter。 
      2. 配置文件优化。在配置文件中可以引用属性,还可以直接替代或传递到组件。而且支持json格式的配置文件。不像其他的日志框架,它在重新配置的时候不会丢失之前的日志文件。 
      3. Java 5的并发性。Log4j 2利用Java 5中的并发特性支持,尽可能地执行最低层次的加锁。解决了在log4j 1.x中存留的死锁的问题。 
      4. 异步logger。Log4j 2是基于LMAX Disruptor库的。在多线程的场景下,和已有的日志框架相比,异步的logger拥有10倍左右的效率提升。

      官方建议一般程序员查看的日志改成异步方式,一些运营日志改成同步。日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影响。

           异步日志在程序的classpath需要加载disruptor-3.0.0.jar或者更高的版本。

        <dependency>

              <groupId>com.lmax</groupId>
              <artifactId>disruptor</artifactId>
              <version>3.3.6</version>
          </dependency>

    异步日志分为两种: 

    a.全异步模式 
      这种异步日志方式,不需要修改修改原理的配置文件,Logger仍然使用<root> and <logger> 
      只需要在主程序代码开头,加一句系统属性的代码:

      System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector")

    b.异步和非异步混合输出模式 

       在配置文件中Logger使用<asyncRoot> or <asyncLogger>

    <loggers>  
         <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">  
            <appender-ref ref="Console" />  
            <appender-ref ref="debugLog" />  
            <appender-ref ref="errorLog" />  
        </AsyncLogger>  
    
        <asyncRoot level="trace" includeLocation="true">  
            <appender-ref ref="Console" />  
        </asyncRoot>   
    </loggers>  

    引入log4j2依赖 
      在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架Logback,

    所以我们在引入log4j2之前,需要先排除该包的依赖,再引入log4j2的依赖。

      log4j2.xml配置 
    有一点需要注意的是,假如想要在application.properties中指定日志文件存放路径或日志文件名,在log4j2.xml中使用${LOG_PATH}或者${LOG_FILE}来引用,是无法获取到的(在logback中可以尽情使用)。

     log4j2支持xml、json、yaml等格式的配置文件。

    SLF4J

    SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,而是通过Facade Pattern提供一些Java logging API,它只服务于各种各样的日志系统。
    按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。作者创建SLF4J的目的是为了替代Jakarta Commons-Logging。 
    实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。
    类似于Apache Common-Logging,SLF4J是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。
    但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
    SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

    那么什么时候使用SLF4J比较合适呢? 
    如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,

    确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.8 Logging的用户时,面对成千上万的log4j调用的修改,

    相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。

    Logback

    Logback,一个“可靠、通用、快速而又灵活的Java日志框架”。

    logback当前分成三个模块:

                logback-core,

                logback- classic

                logback-access。

    logback-core是其它两个模块的基础模块。

    logback-classic是log4j的一个改良版本。

      此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK Logging。

      logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。 

     选择logback的理由: 
    1. logback比log4j要快大约10倍,而且消耗更少的内存。 
    2. logback-classic模块直接实现了SLF4J的接口,所以我们迁移到logback几乎是零开销的。 
    3. logback不仅支持xml格式的配置文件,还支持groovy格式的配置文件。相比之下,Groovy风格的配置文件更加直观,简洁。 
    4. logback-classic能够检测到配置文件的更新,并且自动重新加载配置文件。 
    5. logback能够优雅的从I/O异常中恢复,从而我们不用重新启动应用程序来恢复logger。 
    6. logback能够根据配置文件中设置的上限值,自动删除旧的日志文件。 
    7. logback能够自动压缩日志文件。 
    8. logback能够在配置文件中加入条件判断(if-then-else)。可以避免不同的开发环境(dev、test、uat…)的配置文件的重复。 
    9. logback带来更多的filter。 
    10. logback的stack trace中会包含详细的包信息。 
    11. logback-access和Jetty、Tomcat集成提供了功能强大的HTTP-access日志。 
    配置文件:需要在项目的src目录下建立一个logback.xml。 
    注:(1)logback首先会试着查找logback.groovy文件; 
    (2)当没有找到时,继续试着查找logback-test.xml文件; 
    (3)当没有找到时,继续试着查找logback.xml文件; 
    (4)如果仍然没有找到,则使用默认配置(打印到控制台)。

    Apache Commons Logging

    Apache Commons Logging ,之前叫 Jakarta Commons Logging(JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4+等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现。 
    common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j来使用。使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。 
    使用common-logging的常见代码:

  • 相关阅读:
    史上自定义 JavaScript 函数Top 10
    switch
    (不)扩展内置原型((Not) Augmenting Built-in Prototypes)
    for-in循环(for-in Loops)
    for
    在dreamweaver中设置php服务器F12预览的方法介绍
    method
    CSS中background-image【CSS Sprites,base64编码】
    shell编程中的小问题
    常见的linux问题积累
  • 原文地址:https://www.cnblogs.com/liuwd/p/10942718.html
Copyright © 2011-2022 走看看