Java常用的日志框架對(duì)比

作為Java開(kāi)發(fā)人員,對(duì)于日志記錄框架一定非常熟悉。而且?guī)缀踉谒袘?yīng)用里面,一定會(huì)用到各種各樣的日志框架用來(lái)記錄程序的運(yùn)行信息。而對(duì)于一個(gè)成熟的Java應(yīng)用,這個(gè)是必不可少的。在開(kāi)發(fā)和調(diào)試階段,日志可以幫助我們更快的定位問(wèn)題;而在應(yīng)用的運(yùn)維過(guò)程中,日志系統(tǒng)又可以幫助我們記錄大部分的異常信息,通常很多企業(yè)會(huì)通過(guò)收集日志信息來(lái)對(duì)系統(tǒng)的運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控預(yù)警。

總體概覽

image.png

目前的日志框架有JDK自帶的logginglog4j1、log4j2、logback ,這些框架都自己定制了日志 API ,并且有相應(yīng)的實(shí)現(xiàn);目前用于實(shí)現(xiàn)日志統(tǒng)一的框架 Apache commons-logging、slf4j ,遵循面向接口編程的原則,這兩大框架可以讓用戶在程序運(yùn)行期間去選擇具體的日志實(shí)現(xiàn)系統(tǒng)(log4j1\log4j2\logback等)來(lái)記錄日志,是統(tǒng)一抽象出來(lái)的一些接口。

日志級(jí)別

log4j定義了8個(gè)級(jí)別的log(除去OFF和ALL,可以說(shuō)分為6個(gè)級(jí)別),
優(yōu)先級(jí)從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

ALL 最低等級(jí)的,用于打開(kāi)所有日志記錄。
TRACE 很低的日志級(jí)別,一般不會(huì)使用。
DEBUG 指出細(xì)粒度信息事件對(duì)調(diào)試應(yīng)用程序是非常有幫助的,主要用于開(kāi)發(fā)過(guò)程中打印一些運(yùn)行信息。
INFO 消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過(guò)程。這個(gè)可以用于生產(chǎn)環(huán)境中輸出程序運(yùn)行的一些重要信息。
WARN 表明會(huì)出現(xiàn)潛在錯(cuò)誤的情形,有些信息不是錯(cuò)誤信息,但是也要給開(kāi)發(fā)者的一些提示。
ERROR 指出發(fā)生錯(cuò)誤的信息,可能會(huì)導(dǎo)致系統(tǒng)出錯(cuò)或是宕機(jī)等,必須要避免
FATAL 指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會(huì)導(dǎo)致應(yīng)用程序的退出。這個(gè)級(jí)別比較高了。重大錯(cuò)誤,這種級(jí)別你可以直接停止程序了。
OFF 最高等級(jí),用于關(guān)閉所有日志記錄。

Log4j

官網(wǎng)地址:https://logging.apache.org/log4j/1.2/

簡(jiǎn)介:
Apache 的一個(gè)開(kāi)放源代碼項(xiàng)目,通過(guò)使用Log4j,我們可以控制日志信息輸送的目的地是控制臺(tái)、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;用戶也可以控制每一條日志的輸出格式;通過(guò)定義每一條日志信息的級(jí)別,用戶能夠更加細(xì)致地控制日志的生成過(guò)程。這些可以通過(guò)一個(gè) 配置文件來(lái)靈活地進(jìn)行配置,而不需要修改程序代碼。

在JDK 1.3及以前,Java打日志依賴System.out.println(), System.err.println()或者e.printStackTrace(),Debug日志被寫(xiě)到STDOUT流,錯(cuò)誤日志被寫(xiě)到STDERR流。這樣打日志有一個(gè)非常大的缺陷,即無(wú)法定制化,且日志粒度不夠細(xì)。log4j是在這樣的環(huán)境下誕生的,它是一個(gè)里程碑式的框架,它定義的Logger、AppenderLevel等概念如今已經(jīng)被廣泛使用。

https://mvnrepository.com/中可以查到,log4j1從2005年11月更新到2012年3月,后面就沒(méi)再更新了
最新的依賴(May 26, 2012)

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2015年8月5日,項(xiàng)目管理委員會(huì)宣布Log4j 1.x已達(dá)到使用壽命。建議用戶使用Log4j 1升級(jí)到Apache Log4j 2

Log4j2

官網(wǎng)地址:https://logging.apache.org/log4j/2.x/
Log4j2Log4j1的升級(jí)版本。Log4j2基本上把Log4j1版本的核心全部重構(gòu)掉了,而且基于Log4j1做了很多優(yōu)化和改變。并提供了Logback中可用的許多改進(jìn),同時(shí)修復(fù)了Logback架構(gòu)中的一些固有問(wèn)題。

Log4j2最新的依賴(Mar 11, 2018)

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.0</version>
</dependency>

SpringBoot也有Log4j2相關(guān)的依賴
不過(guò)SpringBoot自帶的jar包已經(jīng)夠用了

image.png

引入依賴(Jun 14, 2018)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>

引入之后可以看到外部jar包多了三個(gè)關(guān)于log4j2的


image.png

關(guān)于上面的包
log4j-to-slf4jlog4j2的接口適配到slf4j上,不能和log4j-slf4j-impl同時(shí)存在
log4j-api包含.class但是只是一堆接口而已,實(shí)際使用需要log4j
log4j-core 包含.class.java也就是源碼

jul 指的是java.util.logging,是 java 內(nèi)置的日志模塊
簡(jiǎn)介:受Log4j啟發(fā),Sun在Java1.4版本中引入了java.util.logging,但是jul功能遠(yuǎn)不如log4j完善,開(kāi)發(fā)者需要自己編寫(xiě)Appenders(Sun稱之為Handlers),且只有兩個(gè)Handlers可用(ConsoleFile),julJava1.5以后性能和可用性才有所提升。

不是SpringBoot項(xiàng)目需要引用jul的話可以加

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jul</artifactId>
    <version>2.11.0</version>
</dependency>

Log4j2的使用

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SpringcloudEurekaApplication {
    static Logger logger = LogManager.getLogger(SpringcloudEurekaApplication.class);
    public static void main(String[] args) {
        logger.info("Current Time: {}", System.currentTimeMillis());
        logger.info("Current Time: " + System.currentTimeMillis());
        logger.info("Current Time: {}", System.currentTimeMillis());
        logger.trace("trace log");
        logger.warn("warn log");
        logger.debug("debug log");
        logger.info("info log");
        logger.error("error log");
    }
}

啟動(dòng)項(xiàng)目后控制臺(tái)輸出為

image.png

SLF4J

官網(wǎng)地址:https://www.slf4j.org/
SLF4J(Simple Logging Facade for Java)用作各種日志框架(java.util.logging,logback,log4j)的簡(jiǎn)單外觀或抽象,允許最終用戶在部署 時(shí)插入所需的日志框架。

最新依賴(Mar 21, 2018)

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.8.0-beta2</version>
</dependency>

Springboot項(xiàng)目不需要引入任何依賴都可以使用

用法

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SpringcloudEurekaApplication{
    private static final Logger logger = LoggerFactory.getLogger(SpringcloudEurekaApplication.class);
    public static void main(String[] args) {
        logger.info("Current Time: {}", System.currentTimeMillis());
        logger.info("Current Time: " + System.currentTimeMillis());
        logger.info("Current Time: {}", System.currentTimeMillis());
        logger.trace("trace log");
        logger.warn("warn log");
        logger.debug("debug log");
        logger.info("info log");
        logger.error("error log");
    }
}

啟動(dòng)項(xiàng)目后控制臺(tái)輸出為

image.png

通常輸出日志開(kāi)銷非常大,SLF4J通過(guò){}作為占位符的方式輸出字符串,相比字符串拼接的方式,效率有顯著的提升。

logback

官網(wǎng)地址:https://logback.qos.ch/
logbacklog4j是同一個(gè)作者創(chuàng)作,它是log4j的升級(jí)版
Logback的體系結(jié)構(gòu)足夠通用,以便在不同情況下應(yīng)用。

logback分為三個(gè)模塊:logback-corelogback-classiclogback-access。

logback-core模塊為其他兩個(gè)模塊奠定了基礎(chǔ)。
logback-classic模塊可以被同化為log4j的顯著改進(jìn)版本。logback-classic本身實(shí)現(xiàn)了SLF4J API,因此您可以在logback和其他日志框架(如log4jjava.util.logging(JUL))之間來(lái)回切換。
logback-access模塊??與Servlet容器(如Tomcat和Jetty)集成,以提供HTTP訪問(wèn)日志功能。可以在logback-core之上輕松構(gòu)建自己的模塊。

Logback的核心對(duì)象:Logger、Appender、Layout

Logback主要建立于Logger、AppenderLayout 這三個(gè)類之上。
Logger:日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對(duì)應(yīng)的context上后,主要用于存放日志對(duì)象,也可以定義日志類型、級(jí)別。Logger對(duì)象一般多定義為靜態(tài)常量.
Appender:用于指定日志輸出的目的地,目的地可以是控制臺(tái)、文件、遠(yuǎn)程套接字服務(wù)器、 MySQL、 PostreSQLOracle和其他數(shù)據(jù)庫(kù)、 JMS和遠(yuǎn)程UNIX Syslog守護(hù)進(jìn)程等。
Layout:負(fù)責(zé)把事件轉(zhuǎn)換成字符串,格式化的日志信息的輸出。

具體使用

引入依賴(Feb 11, 2018),分別對(duì)應(yīng)logback上的三個(gè)模塊

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.3.0-alpha4</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.3.0-alpha4</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.3.0-alpha4</version>
</dependency>

注:如果在SpringBoot下是不需要引入的
Spring Boot內(nèi)部日志系統(tǒng)使用的是Commons Logging,但開(kāi)放底層的日志實(shí)現(xiàn)。默認(rèn)為會(huì)Java Util Logging, Log4J, Log4J2和Logback提供配置。每種情況下都會(huì)預(yù)先配置使用控制臺(tái)輸出,也可以使用可選的文件輸出。

因?yàn)樵赟pringBoot中本身就內(nèi)置了日志功能,在spring-boot-starter依賴中

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

logback的配置介紹

如果沒(méi)有配置文件,那么logback默認(rèn)地會(huì)調(diào)用BasicConfigurator,創(chuàng)建一個(gè)最小化配置。最小化配置由一個(gè)關(guān)聯(lián)到根 loggerConsoleAppender組成。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%nPatternLayoutEncoder進(jìn)行格式化。root logger 默認(rèn)級(jí)別是 DEBUG。

官方推薦

官方推薦使用的xml名字的格式為:logback-spring.xml而不是logback.xml,因?yàn)閹?code>spring后綴的可以使用<springProfile>這個(gè)標(biāo)簽。

Logback配置文件的基本結(jié)構(gòu)

<configuration>開(kāi)頭,后面有任意個(gè)<appender>元素,有任意個(gè)<logger>元素,有最多一個(gè)<root>元素。
Logback 配置文件的語(yǔ)法非常靈活。正因?yàn)殪`活,所以無(wú)法用 DTDXML schema進(jìn)行定義。

1、根節(jié)點(diǎn)<configuration>,包含下面三個(gè)屬性:

scan: 當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
scanPeriod: 設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scantrue時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
debug: 當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
  <!--省略其他配置--> 
</configuration>

2.子節(jié)點(diǎn),分別有<appender>,<root>,<logger>,<property>,<contextName>,<conversionRule>,<springProfile>

1.子節(jié)點(diǎn)<appender>:Logback將執(zhí)行日志事件輸出的組件稱為Appender,實(shí)現(xiàn)的Appender必須繼承 ch.qos.logback.core.Appender接口

它有兩個(gè)必要屬性nameclass。name指定appender名稱,class指定appender的全限定名
注:class="ch.qos.logback.core.rolling.RollingFileAppender"常見(jiàn)的日志輸出到文件,隨著應(yīng)用的運(yùn)行時(shí)間越來(lái)越長(zhǎng),日志也會(huì)增長(zhǎng)的越來(lái)越多,將他們輸出到同一個(gè)文件并非一個(gè)好辦法。RollingFileAppender用于切分文件日志

<appender>有四個(gè)子節(jié)點(diǎn)

<encoder>:對(duì)日志進(jìn)行格式化。必須指定,否則不會(huì)往文件輸出內(nèi)容
%d{HH: mm:ss.SSS}——日志輸出時(shí)間
%thread——輸出日志的進(jìn)程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用
%-5level——日志級(jí)別,并且使用5個(gè)字符靠左對(duì)齊
%logger{36}——日志輸出者的名字
%msg——日志消息
%n——平臺(tái)的換行符

<rollingPolicy>:循環(huán)政策:基于時(shí)間創(chuàng)建日志文件。當(dāng)發(fā)生日志切換時(shí),RollingFileAppender的切換行為。例如日志文件名的修改
常用子節(jié)點(diǎn)
<maxHistory>表示只保留最近天數(shù)的日志,最好設(shè)置下,以防止日志填滿整個(gè)磁盤(pán)空間。
<timeBasedFileNamingAndTriggeringPolicy><maxFileSize>是對(duì)日志大小進(jìn)行切割,設(shè)置每個(gè)日志文件的最大值

<filter>:過(guò)濾器,執(zhí)行一個(gè)過(guò)濾器會(huì)有返回個(gè)枚舉值。
返回DENY,日志將立即被拋棄不再經(jīng)過(guò)其他過(guò)濾器;
返回NEUTRAL,有序列表里的下個(gè)過(guò)濾器過(guò)接著處理日志;
返回ACCEPT,日志會(huì)被立即處理,不再經(jīng)過(guò)剩余過(guò)濾器。

<Appender> 添加一個(gè)或多個(gè)過(guò)濾器后,可以用任意條件對(duì)日志進(jìn)行過(guò)濾。<Appender> 有多個(gè)過(guò)濾器時(shí),按照配置順序執(zhí)行。

最常用的過(guò)濾器

LevelFilter: 級(jí)別過(guò)濾器,根據(jù)日志級(jí)別進(jìn)行過(guò)濾。如果日志級(jí)別等于配置級(jí)別,過(guò)濾器會(huì)根據(jù)onMathonMismatch接收或拒絕日志。
有以下子節(jié)點(diǎn):
<level>:設(shè)置過(guò)濾級(jí)別
<onMatch>:用于配置符合過(guò)濾條件的操作
<onMismatch>:用于配置不符合過(guò)濾條件的操作

<file>:指定正在記錄的日志文件的路徑及文件名。
注意在windows當(dāng)中,反斜杠\ 需要轉(zhuǎn)義,或直接使用/也可以。例如 c:/temp/test.logc:\\temp\\test.log都可以??梢允窍鄬?duì)目錄,也可以是絕對(duì)目錄,沒(méi)有默認(rèn)值,如果上層目錄不存在,FileAppender會(huì)自動(dòng)創(chuàng)建。

我測(cè)試時(shí)放在日志文件是放在E盤(pán)下log文件夾(目錄設(shè)置下文有提到)

image.png

<appender>節(jié)點(diǎn)定義示例

<!-- 時(shí)間滾動(dòng)輸出 level為 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${log.path}/log_info.log</file>
        <!--日志文件輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志歸檔路徑以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天數(shù)-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只記錄info級(jí)別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

2.子節(jié)點(diǎn)<property>:用來(lái)定義變量值,它有兩個(gè)屬性namevalue,通過(guò)

<property>定義的值會(huì)被插入到logger上下文中,可以使“${}”來(lái)使用變量。

<property name="log.path" value="E:/log" />

在上面定義文件路徑中有使用到${log.path}

3.子節(jié)點(diǎn)<contextName>:用來(lái)設(shè)置上下文名稱,每個(gè)logger都關(guān)聯(lián)到logger上下文,默認(rèn)上下文名稱為default。但可以使用<contextName>設(shè)置成其他名字,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置,不能修改。

    <contextName>myAppLogBack</contextName> 

4.子節(jié)點(diǎn)<logger>:用來(lái)設(shè)置某一個(gè)包或具體的某一個(gè)類的日志打印級(jí)別、以及指定<appender>

<logger>僅有一個(gè)name屬性,一個(gè)可選的level和一個(gè)可選的addtivity屬性。
name:用來(lái)指定受此logger約束的某一個(gè)包或者具體的某一個(gè)類。
level:用來(lái)設(shè)置打印級(jí)別,大小寫(xiě)無(wú)關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALLOFF,
addtivity: 是否向上級(jí)logger傳遞打印信息。默認(rèn)是true。

<logger name="org.springframework.web" level="info" addtivity="true"/>

5.子節(jié)點(diǎn)<root>:它也是<logger>元素,但是它是根logger,是所有<logger>的上級(jí)。

root節(jié)點(diǎn)是必選節(jié)點(diǎn),用來(lái)指定最基礎(chǔ)的日志輸出級(jí)別,只有一個(gè)level屬性,因?yàn)?code>name已經(jīng)被命名為root,且已經(jīng)是最上級(jí)了。
level:用來(lái)設(shè)置打印級(jí)別,不能設(shè)置為INHERITED或者同義詞NULL。默認(rèn)是DEBUG
可以包含零個(gè)或多個(gè)元素,標(biāo)識(shí)這個(gè)appender將會(huì)添加到這個(gè)logger。

<root level="all">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="DEBUG_FILE" />
    <appender-ref ref="INFO_FILE" />
    <appender-ref ref="WARN_FILE" />
    <appender-ref ref="ERROR_FILE" />
</root>

6.子節(jié)點(diǎn)<springProfile>:Spring profileSpring 3引入的概念,主要用在項(xiàng)目多環(huán)境運(yùn)行的情況下,通過(guò)激活方式實(shí)現(xiàn)多環(huán)境切換,省去多環(huán)境切換時(shí)配置參數(shù)和文件的修改,相比較Maven profile簡(jiǎn)單實(shí)用,易于上手。并且Spring profile提供了多種激活方法,例如配置文件,注解,jvm參數(shù)設(shè)置等等

據(jù)不同環(huán)境(prod:生產(chǎn)環(huán)境,test:測(cè)試環(huán)境,dev:開(kāi)發(fā)環(huán)境)來(lái)定義不同的日志輸出,在 logback-spring.xml中使用 springProfile 節(jié)點(diǎn)來(lái)定義,方法如下:

<!-- 測(cè)試環(huán)境+開(kāi)發(fā)環(huán)境. 多個(gè)使用逗號(hào)隔開(kāi). -->
<springProfile name="test,dev">
    <logger name="com.example.springcloudeureka" level="info" />
</springProfile>
<!-- 生產(chǎn)環(huán)境. -->
<springProfile name="prod">
    <logger name="com.example.springcloudeureka" level="ERROR" />
</springProfile>

可以啟動(dòng)服務(wù)的時(shí)候指定 profile ,springboot的話可以在配置文件yaml
設(shè)置spring.profiles.active

7.子節(jié)點(diǎn)<conversionRule>:logback 自定義Pattern模板

例如需要在每條日志都輸出logback output字符串,可以這樣做
寫(xiě)一個(gè)轉(zhuǎn)換器類,繼承ClassicConvert

public class LogbackConvert extends ClassicConverter {
    @Override
    public String convert(ILoggingEvent iLoggingEvent) {
        return "logback output";
    }
}

實(shí)現(xiàn)里面的方法,返回的都是String類型
logback配置文件中中注冊(cè)該轉(zhuǎn)換器,并自定義轉(zhuǎn)換符

<conversionRule conversionWord="logback" 
converterClass="com.example.springcloudeureka.LogbackConvert"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender" > 
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %logback %n</pattern>
</appender>

<appender>中自定義Pattern模板,用%轉(zhuǎn)換器名即可
效果

image.png

都打印出logback output字符串

Apache Commons Logging

官方地址:https://commons.apache.org/proper/commons-logging/
Jakarta Commons-logging(JCL)是apache最早提供的日志的門(mén)面接口。提供簡(jiǎn)單的日志實(shí)現(xiàn)以及日志解耦功能。
commons-loggingApache commons類庫(kù)中的一員。Apache commons類庫(kù)是一個(gè)通用的類庫(kù),提供了基礎(chǔ)的功能,比如說(shuō)commons-fileuploadcommons-httpclient,commons-io
commons-codes等。

commons-logging能夠選擇使用Log4j還是JDK Logging,但是不依賴Log4jJDK Logging
API。如果項(xiàng)目的classpath中包含了log4j的類庫(kù),就會(huì)使用log4j,否則就使用
JDK Logging。使用commons-logging能夠靈活的選擇使用那些日志方式,而且不需要修改源代碼。

不過(guò)現(xiàn)在Apache Commons Logging也不更新了,最新的依賴(Jul 05, 2014)

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

具體實(shí)現(xiàn)

JCL有兩個(gè)基本的抽象類:Log( 基本記錄器 ) 和 LogFactory( 負(fù)責(zé)創(chuàng)建 Log 實(shí)例 )

public class SpringbootApplication {
    public static Log LOG= LogFactory.getLog(SpringbootApplication.class);
    public static void main(String[] args) {
        LOG.debug("debug()...");
        LOG.info("info()...");
        LOG.error("error()...");
    }
}

控制臺(tái)顯示

image.png

SpringBoot已經(jīng)默認(rèn)集成了log4j

關(guān)于commons-logging日志解耦可以參考文章:https://blog.csdn.net/sakurainluojia/article/details/53534949

總結(jié):

commons-loggingslf4j都是日志的接口,供用戶使用,而沒(méi)有提供實(shí)現(xiàn)。log4j,logback等才是日志的真正實(shí)現(xiàn),日志是接口+具體實(shí)現(xiàn)的方式來(lái)使用。
目前應(yīng)用比較廣泛的是Log4j2logback,而logback作為后起之秀,以替代log4j為目的,整體性能比log4j較佳,log4j的升級(jí)版log4j2也是有諸多亮點(diǎn)

選擇使用

logbackSpring Boot默認(rèn)的日志系統(tǒng),假如對(duì)日志沒(méi)有特殊要求,可以完全零配置(當(dāng)然也可以自定義logback-spring.xml)使用 SLF4J(Simple Logging Facade For Java)logback來(lái)輸出日志。

個(gè)人推薦使用log4j2Log4j2Log4j的升級(jí)版,與之前的版本Log4j 1.x相比、有重大的改進(jìn),在修正了Logback固有的架構(gòu)問(wèn)題的同時(shí),改進(jìn)了許多Logback所具有的功能。關(guān)于Log4j2的新特性可以在其官網(wǎng)首頁(yè)查看

關(guān)于log4j2的性能使用可以參考

http://m.itdecent.cn/p/570b406bddcd
https://blog.csdn.net/u011054333/article/details/54412360
https://blog.csdn.net/yjh1271845364/article/details/70888262

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在項(xiàng)目開(kāi)發(fā)過(guò)程中,我們可以通過(guò) debug 查找問(wèn)題。而在線上環(huán)境我們查找問(wèn)題只能通過(guò)打印日志的方式查找問(wèn)題。因此...
    Java架構(gòu)閱讀 3,574評(píng)論 2 41
  • 對(duì)于Java的日志框架,你也許會(huì)經(jīng)??吹竭@些名詞: Log4j、Log4j2 Logback Slf4j JCL ...
    NoahU閱讀 4,142評(píng)論 0 15
  • 前言 最近學(xué)習(xí)開(kāi)java web服務(wù)器開(kāi)發(fā),開(kāi)始學(xué)習(xí)java,處理業(yè)務(wù)邏輯,但對(duì)其中的日志比較好奇,之前沒(méi)怎么接觸...
    九風(fēng)萍舟閱讀 3,428評(píng)論 1 6
  • 歷史 log4j可以當(dāng)之無(wú)愧地說(shuō)是Java日志框架的元老,1999年發(fā)布首個(gè)版本,2012年發(fā)布最后一個(gè)版本,20...
    kelgon閱讀 10,298評(píng)論 3 53
  • 前言 今天來(lái)介紹下Spring Boot如何配置日志logback,我剛學(xué)習(xí)的時(shí)候,是帶著下面幾個(gè)問(wèn)題來(lái)查資料的 ...
    OzanShareing閱讀 1,112評(píng)論 0 2

友情鏈接更多精彩內(nèi)容