原文鏈接,點擊跳轉(zhuǎn)
文中代碼示例獲?。宏P(guān)注【Qin的學(xué)習(xí)營地】,回復(fù)【日志框架梳理】
日志框架發(fā)展歷程
在了解日志框架時總會列出一系列框架:Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2,這么多框架讓人感到混亂,該怎么選取、該怎么用。接下來,讓我們逐步理清這些框架及之間的關(guān)系。
首先來了解日志框架的發(fā)展歷程,就能大致清楚這些框架之間的關(guān)聯(lián)和區(qū)別。
-
1996 年,Log4j 開始出現(xiàn),并成為一個流行的 Java 日志記錄包,后來貢獻給 Apache 基金會,但在 2015 年宣布不在維護了。
reload4j 是 Apache log4j 版本 1.2.17 的一個分支,旨在解決 log4j 的安全問題。Reload4j 是log4j 版本 1.2.17 的直接替代品,所以想繼續(xù)使用 log4j 1.x 的框架,推薦使用 slf4j-reload4j 進行替代。
-
2002 年 Java 1.4 發(fā)布,同時推出自己的日志庫 JUL(Java Util Logging)。Apache 曾建議 sun 公司 將 Log4j 引入到 jdk 中,但被拒絕了,sun 公司仿照 Log4j,實現(xiàn)一套自己的日志實現(xiàn)框架,即 JUL。
-
同時,Apache 推出了 JCL(Jakarta Commons Logging,一個簡單的日志門面框架),它提供了一套統(tǒng)一的日志接口,解決 Java 應(yīng)用程序中使用不同日志框架導(dǎo)致的代碼依賴問題,其內(nèi)部提供了一個 Simple Log 簡單日志實現(xiàn),支持集成使用 Log4j、jdk 1.4(JUL)等具體日志實現(xiàn)。
JCL最初是由Apache軟件基金會的Jakarta 項目組開發(fā)的,當(dāng)時它是 Apache Jakarta 項目的一部分。在2011年,Jakarta 項目組重新組織并成為 Apache Commons 項目。因此,JCL 目前被稱為 Apache Commons Logging。
-
2006年,log4j 的作者又發(fā)布了 SLF4J(Simple Logging Facade for Java,是一個簡單的日志門面框架),旨在提供統(tǒng)一的日志API,解決 Java 應(yīng)用程序中使用不同日志框架導(dǎo)致的代碼依賴問題。它比 Apache Commons Logging(JCL)見簡單、穩(wěn)定,支持集成各種日志實現(xiàn)框架(Jul、log4j 1.x、reload4j 和 Logback)。
-
同時,SLF4J 的作者順帶推出了 Logback 日志實現(xiàn)框架。
-
2014年,Apache 發(fā)布了 Log4j2,是 log4j 的官方升級版。
綜上:
- 日志門面技術(shù)(規(guī)范):JCL、SLF4J
- 日志實現(xiàn)框架:Log4j 、JUL、Logback、Log4j2。
Log4j
Log4j 介紹
Log4j 有三個主要的組件:日志記錄器(Logger),日志輸出目標(biāo)(Appenders)和日志格式化器(Layouts)。
-
日志記錄器(Logger):Logger 組件在此系統(tǒng)中被分為五個級別:DEBUG、INFO、WARN、ERROR 和 FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,分別用來指定這條日志信息的重要程度,只輸出級別不低于設(shè)定級別的日志信息,假設(shè) Logger 級別設(shè)定為 INFO,則INFO、WlARN、 ERROR 和 FATAL 級別的日志信息都會輸出,而級別比 INFO 低的 DEBUG 則不會輸出。
-
日志輸出目標(biāo)(Appender):日志輸出目標(biāo)定義了日志消息的輸出位置。Log4j 提供了多個內(nèi)置的輸出目標(biāo),如控制臺、文件、數(shù)據(jù)庫等。開發(fā)人員可以根據(jù)需要配置一個或多個輸出目標(biāo)來將日志消息輸出到不同的位置。
常使用的類如下:
- org.apache.log4j.ConsoleAppender(輸出到控制臺)
- org.apache.log4j.FileAppender(輸出到文件)
- org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個日志文件)
- org.apache.log4j.RollingFileAppender(日志文件到達指定大小的時候產(chǎn)生一個新的日志文件)
- org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
-
日志格式化器(Layout):日志格式化器定義了日志消息的輸出格式。Log4j 提供了多個內(nèi)置的格式化器,如簡單文本格式、HTML格式、XML格式、自由指定樣式等。開發(fā)人員可以根據(jù)需要選擇適當(dāng)?shù)母袷交鱽砜刂迫罩鞠⒌妮敵鰳邮健?/p>
常使用的類如下:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以靈活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間、線程、類別等信息)
Log4j 配置文件
Log4j 使用一個配置文件來指定日志記錄器、輸出目標(biāo)、格式化器等的配置信息。在實際應(yīng)用中,在 使用 Log4j 之前先設(shè)置配置文件。配置文件事實上也就是對 Logger、Appender 及 Layout 進行相應(yīng)設(shè)置。Log4j 支持兩種配置文件格式,一種是 XML 格式的文件,一種是 properties 屬性文件。下面是以 xml 屬性文件的配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<!-- 設(shè)置日志輸出位置 -->
<param name="Target" value="System.out" />
<!-- 設(shè)置日志輸出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c{1} : %m%n" />
</layout>
</appender>
<!-- 指定包下的日志輸出級別 -->
<!-- <logger name="com.jcl.demo">-->
<!-- <level value="error"/>-->
<!-- </logger>-->
<!-- 配置所有包下的日志輸出級別, 除了 logger 指定的包>-->
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4j:configuration>
Log4j 使用示例
-
引入依賴
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>
-
按照上面 Log4j 設(shè)置配置文件
-
代碼示例
import org.apache.log4j.Logger; import org.junit.Test; public class Log4jTest { @Test public void Log4jTest() { Logger log = Logger.getLogger(Log4jTest.class); log.info("info日志打印"); log.error("error日志打印"); } }
JUL(Java Util Logging)
JUL 介紹
JUL 是 Java 1.4 版本自帶的日志框架,JUL的核心組件是java.util.logging
包中的類和接口。Logger
是最重要的類,用于創(chuàng)建和管理日志記錄器。Handler
用于定義日志消息的輸出目的地,如控制臺、文件等。Formatter
定義了日志消息的格式。Level
表示日志的級別,JUL定義了七個日志級別,從低到高分別是:ALL、FINEST、FINER、FINE、CONFIG、INFO、WARNING、SEVERE、OFF。
JUL的默認(rèn)配置是通過配置文件logging.properties
進行的。
JUL 使用示例
-
Java 核心包,所以無需引入其他依賴
-
配置 logging.properties 文件設(shè)置日志相關(guān)信息,不配置取默認(rèn)設(shè)置。
-
Java 代碼示例
import org.junit.Test; import java.util.logging.Logger; public class JulTest { @Test public void testLog(){ Logger log = Logger.getLogger("com.jcl.demo.JulTest"); log.info("info日志打印"); } }
JCL(Jakarta Commons Logging)
JCL 介紹
JCL(Jakarta Commons Logging,一個簡單的日志門面技術(shù)),它提供了一套統(tǒng)一的日志接口,通過集成不同的日志實現(xiàn)框架來處理日志記錄。JCL 是 Apache 中的項目。
前面介紹了 Log4j 和 JUL 日志實現(xiàn)框架,使用兩種框架需要分別定義不同框架下的類,隨著框架或者業(yè)務(wù)發(fā)展,有時需要使用或替換不同的日志實現(xiàn)框架,這時業(yè)務(wù)代碼中的日志實現(xiàn)是深度耦合的,開發(fā)人員修改替換使用的日志類非常麻煩。于是出現(xiàn)了日志門面框架,就是提供一系列通用接口(規(guī)范),在業(yè)務(wù)代碼中統(tǒng)一使用日志門面框架提供的接口,日志處理操作交由引入的具體日志實現(xiàn)框架來實現(xiàn)。這就好比 JDBC 數(shù)據(jù)庫驅(qū)動,統(tǒng)一調(diào)用 JDBC 的接口,具體處理方式由引入的具體驅(qū)動包來實現(xiàn)。這樣在更換日志實現(xiàn)框架時不需要修改業(yè)務(wù)代碼,解耦特定的日志實現(xiàn)。
JCL 使用示例
-
JCL 是 Apache 中的項目,所以需要引入依賴包
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
-
若沒有引入其他日志實現(xiàn)框架,默認(rèn)使用 Java 1.4 自帶的日志框架(JUL),若使用 Log4j 日志實現(xiàn)框架,引入相關(guān)依賴,配置 log4j.xml。
-
代碼使用示例,可以看到業(yè)務(wù)代碼使用日志門面框架中的接口類,具體日志處理交由對應(yīng)的日志實現(xiàn)框架處理,這樣在更換日志實現(xiàn)框架時,不需要修改業(yè)務(wù)代碼,只需要對相關(guān)日志實現(xiàn)框架進行相應(yīng)配置即可。
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; public class JclTest { @Test public void testLog(){ Log log = LogFactory.getLog(JclTest.class); log.info("info日志打印"); log.error("error日志打印"); } }
Logback
logback 使用示例
-
引入依賴,這個包依賴了 slf4j-api,所以是 slf4j + logback 的形式。
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.12</version> </dependency>
-
配置 logback.xml
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} === %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="CONSOLE" /> </root> </configuration>
-
代碼使用示例
import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogbackTest { @Test public void Log4jTest() { Logger log = LoggerFactory.getLogger(LogbackTest.class); log.info("info日志打印"); log.error("error日志打印"); } }
SLF4J(Simple Logging Facade For Java)
SLF4J 介紹
SLF4J 也是一個日志門面框架,即簡單日志門面(Simple Logging Facade For Java),主要是為了提供一套標(biāo)準(zhǔn)、規(guī)范的日志接口,具體的實現(xiàn)交由其他日志實現(xiàn)框架。
參考官網(wǎng),SLF4J 可以集成使用以下不同的日志實現(xiàn)框架:
- slf4j-api.jar 包,這是使用 SLF4J 接口需要使用的 jar 包,只引入該 jar 包,使用時會提示沒有提供日志實現(xiàn),默認(rèn)會去使用 slf4j-nop 日志實現(xiàn)框架,一種無操作的日志記錄機制。
- slf4j-nop.jar 包,這是 SLF4J 的一個日志實現(xiàn),它實際上是一個空操作的日志記錄器。當(dāng)應(yīng)用程序使用slf4j-nop作為日志框架時,所有的日志操作都將被忽略,不會有任何實際的日志輸出。
- slf4j-simple.jar 包,這是 SLF4J 的一個簡單日志實現(xiàn),它提供了一個輕量級的日志記錄器,適用于簡單的應(yīng)用程序和測試環(huán)境。
- logback-classic.jar + logback-core.jar 包,logback-core是Logback框架的一個核心模塊,作為logback-classic的基礎(chǔ)組件之一,它提供了Logback框架的核心功能和基本組件;logback-classic 是 Logback 框架的一個核心模塊,它建立在logback-core之上,提供了與log4j兼容的API,并且是log4j的繼任者。實際引入 logback-classic 包即可,該包中引入了 logback-core 包。
- reload4j.jar + slf4j-reload4j.jar 包,reload4j 是 log4j 的一個擴展版本,slf4j 需要使用這個三方日志實現(xiàn)框架,需要使用 slf4j-reload4j 適配器(橋接器),即 slf4j ——> slf4j-reload4j ——> reload4j。
- JUL + slf4j-jdk14.jar 包,JUL 是 Java 1.4 自帶的的日志實現(xiàn)框架,slf4j 集成這個日志實現(xiàn)框架使用,同樣需要引入 slf4j-jdk14 適配器(橋接器),即 slf4j ——> slf4j-jdk14 ——> JUL。
- 深灰色框表示需要引入的 jar 包(如:slf4j-api.jar);
- 淺藍色框表示slf4j日志門面框架;
- 深藍色框表示slf4j本地的日志實現(xiàn)框架;
- 綠色框表示需要使用的適配器;
- 淺灰色框表示其他的日志實現(xiàn)框架;
SLF4J 使用示例
-
引入 SLF4J 依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency>
-
需要引入日志實現(xiàn)框架依賴包,否則默認(rèn)使用 slf4j-nop,slf4j 本地的日志實現(xiàn)。
使用 slf4j-nop 日志實現(xiàn),不輸出任何日志,即忽略日志
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.36</version> </dependency>
使用 reload4j 日志實現(xiàn),需要引入橋接器,配置 log4j.xml
<!-- 橋接器 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-reload4j</artifactId> <version>1.7.36</version> </dependency> <!-- reload4j 日志實現(xiàn)框架 --> <dependency> <groupId>ch.qos.reload4j</groupId> <artifactId>reload4j</artifactId> <version>1.2.25</version> </dependency>
使用 jul 日志實現(xiàn),jul java 自帶,不需要引入包,但需要引入橋接器
<!-- jul 日志實現(xiàn)需要引入的橋接器 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.7.36</version> </dependency>
使用 logback 日志實現(xiàn),配置 logback.xml
<!-- logback 日志實現(xiàn), slf4j 本地的日志實現(xiàn), logback-classic 包中包含 logback-core --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.12</version> </dependency>
使用 log4j2 日志實現(xiàn),配置 log4j2.xml
<!-- 使用 Log4j2 日志實現(xiàn)框架 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> <!-- 橋接器 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.1</version> </dependency>
-
代碼使用示例
import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Slf4jTest { @Test public void Log4jTest() { Logger log = LoggerFactory.getLogger(Slf4jTest.class); log.info("info日志打印"); log.error("error日志打印"); } }
Log4j2
Log4j2 是 Log4j 的升級版。
logback 使用示例
-
引入依賴,這個包依賴了 slf4j-api,所以是 slf4j + logback 的形式。
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency>
-
配置 logback.xml
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} == %msg%n" /> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
-
代碼使用示例文章來源:http://www.zghlxwxcb.cn/news/detail-753525.html
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test; public class Log4j2Test { @Test public void Log4jTest() { Logger log = LogManager.getLogger(Log4j2Test.class); log.info("info日志打印"); log.error("error日志打印"); } }
? 日志框架梳理(Log4j,Reload4j,
JUL,JCL,SLF4J,Logback,Log4j2)文章來源地址http://www.zghlxwxcb.cn/news/detail-753525.html
到了這里,關(guān)于日志框架梳理(Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!