中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

slf4j log4j logback關系詳解和相關用法是什么

發布時間:2021-10-19 10:50:48 來源:億速云 閱讀:232 作者:柒染 欄目:大數據

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 {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Program.class);
        logger.info("hello world");
    }
}

slf4j log4j logback關系詳解和相關用法是什么

從運行結果可以看到,由于沒有給出具體的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>

slf4j log4j logback關系詳解和相關用法是什么

此時會自動添加三個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">

控制臺輸出日志的配置文件(復制可以直接用)

<?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");

看完上述內容,你們掌握slf4j log4j logback關系詳解和相關用法是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乌珠穆沁旗| 东海县| 桃源县| 浑源县| 福海县| 两当县| 芦溪县| 华坪县| 五莲县| 曲麻莱县| 庆云县| 宽甸| 循化| 高阳县| 洞口县| 耿马| 刚察县| 昌吉市| 玉屏| 东乡族自治县| 静乐县| 大厂| 拉萨市| 余庆县| 平利县| 蓝田县| 永平县| 灵武市| 武义县| 富裕县| 城口县| 钦州市| 晋城| 江川县| 乐平市| 和龙市| 通化市| 海南省| 邯郸市| 遵义县| 肃南|