`

slf4j log4j logback关系详解及相关用法

    博客分类:
  • log
 
阅读更多

 转自:https://www.cnblogs.com/Sinte-Beuve/p/5758971.html

slf4j log4j logback关系详解和相关用法

写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯。但是始终都是抱着“拿来主义”的态度,复制粘贴下配置文件就开始编码了,于是这段时间详细的看了下日志库。

slf4j log4j logback的关系

The Simple Logging Facade for Java是什么?

笼统的讲就是slf4j是一系列的日志接口,而log4j logback是具体实现了的日志框架。接下来我们跟着官方文档详细的来看一下他们的关系。

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time. Note that SLF4J-enabling your library/application implies the addition of only a single mandatory dependency, namely slf4j-api-1.7.21.jar.

官方文档的这一段话已经明确描述了三者的关系。slf4j译为简单日志门面,是日志框架的抽象。而log4j和logback是众多日志框架中的几种。

这里写了几行简单的代码来验证一下。

public class Program {
    publicstaticvoidmain(String[] args) {
        Logger logger = LoggerFactory.getLogger(Program.class);
        logger.info("hello world");
    }
}

从运行结果可以看到,由于没有给出具体的logger实现,无法在控制台输出日志。也就是说我们在具体开发中,需要绑定一个日志框架,才能正常的使用slf4j。

log4j和logback呢?

而log4j和logback就是两个受欢迎的日志框架。但两者又有不同。

  • log4j是apache实现的一个开源日志组件。(Wrapped implementations)
  • logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架。是slf4j的原生实现。(Native implementations)

enter image description here
上图可以看到应用程序对日志框架的调用关系。应用程序调用slf4j api,而日志的输出最终是由底层的日志框架来实现的。这张图也提现了log4j和logback的不同。

官方文档对logback的描述

NATIVE IMPLEMENTATION There are also SLF4J bindings external to the SLF4J project, e.g. logback which implements SLF4J natively. Logback's ch.qos.logback.classic.Logger class is a direct implementation of SLF4J's org.slf4j.Logger interface. Thus, using SLF4J in conjunction with logback involves strictly zero memory and computational overhead.

可以看到logback是直接实现了slf4j的接口,是不消耗内存和计算开销的。而log4j不是对slf4j的原生实现,所以slf4j api在调用log4j时需要一个适配层。

总结:

  1. slf4j是java的一个日志门面,实现了日志框架一些通用的api,log4j和logback是具体的日志框架。
  2. 他们可以单独的使用,也可以绑定slf4j一起使用。
  • 单独使用。分别调用框架自己的方法来输出日志信息。
  • 绑定slf4j一起使用。调用slf4j的api来输入日志信息,具体使用与底层日志框架无关(需要底层框架的配置文件)

显然这里我们不推荐单独使用日志框架。假设项目中已经使用了log4j,而我们此时加载了一个类库,而这个类库依赖另一个日志框架。这个时候我们就需要维护两个日志框架,这是一个非常麻烦的事情。而使用了slf4j就不同了,由于应用调用的抽象层的api,与底层日志框架是无关的,因此可以任意更换日志框架。

使用slf4j绑定日志系统的优势

  • 软件工程的角度。抽象,解耦,便于维护。可以参考一下上面的例子。
  • 语法设计角度。slf4j有{}占位符,而log4j需要用“+”来连接字符串,既不利于阅读,同时消耗了内存(heap memory)。
  • 详细的描述可以参考:http://www.importnew.com/7450.html

log4j与logback

作为log4j的开发者,对log4j一定不陌生,他是apache的一个开源日志框架。而logback相对于log4j来说,更新一点,是由log4j的作者设计实现的,第一个版本是2011推出的。无论从设计上还是实现上,Logback相对log4j而言有了相对多的改进。但是两者的用法几乎差别不大。下面是logback的优势:

  • 更快的执行速度
  • 充分的测试
  • logback-classic 非常自然的实现了SLF4J
  • 丰富的扩展文档
  • 可以使用使用XML配置文件或者Groovy
  • 自动重新载入配置文件
  • 优雅地从I/O错误中恢复
  • 自动清除旧的日志归档文件
  • 自动压缩归档日志文件
  • 更多优点可以参考官方文档。中文版 英文版

以上,从性能的角度,可以尽快从log4j迁移到logback上来。

slf4j绑定log4j的用法

由于现在log4j使用的还比较多,所以介绍下他的基本用法。

ide相关设置

这里我们使用的IntelliJ IDEA2016.1和maven。

  1. 在pom.xml添加相关依赖。
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>

此时会自动添加三个jar包。

配置文件

log4j的正常运行需要配置文件,配置文件类型:log4j配置文件可以是log4j.xml也可以是log4j.properties。需要为其配置root、appender、layout等信息。

虽然网上大多数教程都是用log4j.properties来配置的(键值对),但是我个人觉得用xml配置,节点更清晰,而且在idea下有代码提示,可以降低配置错误的概率。下面我就就不具体讲配置文件了,只提几个关键的地方。

  1. 必须配置root logger和一个appender。
  2. 日志输出级别,由高到低为

        FATAL        
        ERROR      
        WARN        
        INFO        
        DEBUG    

下面给出配置文件。

<?xml version="1.0"  encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

    <!--若干个appender的定义-->
    <!--org.apache.log4j.ConsoleAppender 输出到控制台-->
    <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
        <!--输出格式-->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
        </layout>
    </appender>

    <!--org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件-->
    <appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="output.log"/><!--文件位置-->
        <param name="Append" value="true"/><!--是否选择追加-->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
        </layout>
    </appender>

    <!--org.apache.log4j.RollingFileAppender 滚动日志文件输出 文件大小到达一定尺寸时重新产生新的文件-->
    <!--<appender name="myFile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="D:/output.log" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="500KB"/>
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
        </layout>
    </appender>-->

    <!--将各个包中的类日志输出到不同的日志文件中
        这样可以便于日志的分类。
        可以通过这个设置,把业务逻辑的日志添加到数据库。起到过滤的作用
    -->
    <!--这段配置的就是说把包名为“com.zjut.a1”且优先级为debug的日志通过myFile这个appender来处理。
    -->
    <category name="com.zjut.a1">
        <priority value="debug"/>
        <appender-ref ref="myFile"/>
    </category>


    <!-- 根logger的设置-->
    <root>
        <!--优先级设置,假设设置为“info”,则无法输出debug级别的日志-->
        <priority value="debug"/>
        <!--<priority value="info"/>-->
        <!--<priority value="warn"/>-->
        <!--<priority value="error"/>-->
        <!--<priority value="fatal"/>-->

        <!--添加刚才设置的appender-->
        <appender-ref ref="myConsole"/>
        <appender-ref ref="myFile"/>
    </root>
</log4j:configuration>

控制台输出日志的配置文件(复制可以直接用)

<?xml version="1.0"  encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
        </layout>
    </appender>
    <root>
        <priority value="debug"/>
        <appender-ref ref="myConsole"/>
    </root>
</log4j:configuration>

配置文件详解,可以参考:http://zengxiantao.iteye.com/blog/1881700

应用调用

 // 类名.class
Logger logger = LoggerFactory.getLogger(Program.class);
// 输出字符串
logger.debug("this is a debug msg");
// 占位符
logger.debug("hi,welcome {},today is {}","admin","Sunday");

slf4j绑定logback的用法

pom.xml添加依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>

网上教程添加了很多,其实只要添加这一个,其他的依赖jar都会被下载下来。

配置文件

配置文件几乎和log4j差不多,如下。选择需要的appender就可以了。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>


    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
         the key "bySecond" into the logger context. This value will be
         available to all subsequent configuration elements. -->
    <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>testFile-${bySecond}.log</file>
        <append>true</append>
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="DAYFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

            <!-- keep 30 days' worth of history capped at 3GB total size -->
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>

        </rollingPolicy>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DAYFILE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

详细配置文件,可以参考http://logback.qos.ch/manual/index.html
虽然是英文的,但是写的已经是非常清楚了。

程序调用

同为slf4j的api,代码相同。

 // 类名.class
Logger logger = LoggerFactory.getLogger(Program.class);
// 输出字符串
logger.debug("this is a debug msg");
// 占位符
logger.debug("hi,welcome {},today is {}","admin","Sunday");
分享到:
评论

相关推荐

    如何将应用的log4j替换成logback详解

    需要注意的是,由于Logback是SLF4J的实现,所以应用中的日志调用应直接通过SLF4J的API进行,避免使用Log4j的API。 总结,Logback在性能、灵活性和可配置性上都优于Log4j,且迁移过程相对简单。通过替换依赖、创建新...

    slf4j+log4j2配置使用

    接下来,将详细介绍SLF4J和Log4j2的配置使用。 ### SLF4J与Log4j2的配合使用 在Spring Boot项目中,可以使用SLF4J作为日志门面,通过Log4j2实现日志记录。首先需要在项目中排除Spring Boot默认的日志实现(即...

    hibernate3.3.1接口实现包 slf4j-log4j12-1.5.2

    SLF4J(Simple Logging Facade for Java)是一个为各种日志框架提供一个简单统一的API,例如Log4j、Java Util Logging、Logback等。它的目标是允许最终用户在部署时插入所需的日志框架。SLF4J-Log4j12-1.5.2是SLF4J...

    slf4j日志框架的源代码分享

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...

    Slf4j日志相关jar包

    **Slf4j日志框架详解** Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单...在实际项目中,结合使用Slf4j和Log4j,既可以享受Slf4j的灵活性,又能利用Log4j的强大功能,为开发和维护带来极大的便利。

    详解log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

    例如,我们可以使用log4j-over-slf4j将SLF4J桥接到Log4j上,也可以使用slf4j-log4j12将SLF4J桥接到Log4j 1.2上。 log4j-over-slf4j和slf4j-log4j12是两个不同的桥接器,它们之间的桥接和绑定机制可能会导致堆栈溢出...

    logback + slf4j web项目源码

    2. **SLF4J (Simple Logging Facade for Java)**: SLF4J 提供了一组API,使得开发人员能够插入他们所选择的日志框架,例如Logback、log4j等。它是一个抽象层,允许用户在部署时选择合适的日志实现,通过简单的API...

    log4j所需jar包

    总结来说,"apache-log4j-1.2.16.zip"是一个包含Log4j核心库的压缩包,配合"slf4j-log4j12-1.7.2.jar"适配器,可以在使用SLF4J API的同时利用Log4j进行日志记录。通过"log4j.properties"配置文件,可以定制化日志的...

    slf4j使用手册

    ### SLF4J 使用手册详解 #### 一、SLF4J 概述 SLF4J(Simple Logging Facade for Java)是一个用于多种日志框架的简化接口或抽象层,旨在将日志的创建者与具体的日志实现进行解耦。通过这种方式,开发人员可以在...

    详解Spring Boot 使用slf4j+logback记录日志配置

    Logback 是 SLF4J 推荐的日志实现,它由 log4j 的创始人设计,提供了高速、灵活且可靠的日志记录功能。 使用 SLF4J 和 Logback 进行日志记录配置的主要目的是: 1. 为 Spring 的开发提供了一个更快速更广泛的入门...

    slf4j-nop-1.7.3.jar

    - **NOP实现**:当使用SLF4J-nop时,所有调用到SLF4J的日志方法(如`logger.info()`, `logger.debug()`等)都将被忽略,不会有任何输出,适合在不需要日志或性能敏感的应用场景中使用。 3. 日志API的使用: - **...

    logbackーslf4j-配置文件实例 难得

    **Logback-SLF4J配置文件详解** 在Java开发中,日志管理是不可或缺的一部分,Logback和SLF4J(Simple Logging Facade for Java)是广泛使用的日志框架。SLF4J提供了一个接口层,允许开发者选择任何底层的日志实现,...

    SLF4J配置应用

    其中`logback-classic`模块是对Log4j的一种改进,同时它也完全实现了SLF4J的API接口,使得Logback可以无缝地与SLF4J配合使用。 #### 四、SLF4J配置概述 SLF4J的核心理念是提供一个简单的日志接口,具体的日志实现...

    日志框架log4j和slf4j入门教程(私塾在线)视频配套学习资料

    ### 日志框架log4j和slf4j入门教程知识点详解 #### 一、Log4j简介 **Log4j** 是Apache组织下的一个开源项目,主要用于Java应用程序的日志记录功能。通过Log4j,开发者可以灵活地控制日志信息的输出格式、输出目的...

    logback-1.2.3&slf4j-1.7.25.rar

    《Java日志框架Logback与SLF4J详解》 在Java开发中,日志记录是不可或缺的一部分,它能够帮助开发者追踪程序运行状态,定位问题,优化性能。Logback和SLF4J(Simple Logging Facade for Java)是Java世界中广泛使用...

    log4j使用教程(详解)

    虽然Log4j非常流行,但随着技术的发展,出现了许多其他优秀的日志框架,如Logback(由Log4j的作者创建,更高效、更灵活)、SLF4J(Simple Logging Facade for Java,作为日志API,可与其他日志框架集成)。...

    logback配置详解

    logback-classic 是 log4j 的一个改良版本,同时它完整实现了 slf4j API,使你可以很方便地更换成其它日志系统如 log4j 或 JDK14 Logging。 在 logback 中,Logger 是日志的记录器,把它关联到应用的对应的 context...

    详解slf4j+logback在java工程中的配置

    SLF4J(Simple Logging Facade for Java)和Logback是Java开发中广泛使用的日志框架,它们提供了灵活的日志记录解决方案。SLF4J是一个接口层,它为各种日志框架提供了统一的抽象,而Logback是SLF4J的一个实现,用于...

    log4j配置详解与使用方法说明

    本文将深入探讨Log4j的配置与使用方法。 ### 一、Log4j概述 Log4j 是一个灵活的日志框架,支持多种输出格式,如控制台、文件、数据库等。它提供了丰富的日志级别(DEBUG、INFO、WARN、ERROR、FATAL),以及自定义...

    hibernate annotation+slf4j

    2. 日志API使用:使用`org.slf4j.Logger`和`org.slf4j.LoggerFactory`获取日志实例,然后通过`logger.info()`, `logger.debug()`, `logger.error()`等方法输出不同级别的日志。 3. 日志配置:配置相应的日志实现库...

Global site tag (gtag.js) - Google Analytics