前言:日志通常列印在控制臺或者日志檔案,列印需要考慮格式、日志級別、性能等問題,手動實作起來比較麻煩,為此衍生出一大批的日志列印框架比如JUL(java util logging)、logback、log4j、log4j2,
一、日志實作
1.JUL(Java util logging)
1.1 入門案例
JUL是JDK提供的日志列印工具,使用起來比較簡單,不需要引入外部依賴,下面就是最簡單的一個入門案例,
@Test public void testJUL() {
// 獲取Logger物件 Logger logger = Logger.getLogger("com.xxx.log.JULLogTest"); logger.info("hello JUL"); }
1.2 概念
JUL引入了很多重要的概念,后續的其他框架也進行了參考,
Logger:被稱為日志記錄器,應用程式通過獲取Logger物件,并呼叫其方法完成日志列印,
Appender:也被稱為Handler,一個Logger物件可以關聯一個或多個Appender物件,Logger會將日志交給Appender處理,不同的Appender實作列印的日志位置也不同,比如可以將日志列印至控制臺、檔案、資料庫等,
Layout:負責對日志資料進行格式化,
Level:日志級別
JUL中的Logger(后面的日志實作也都遵循此規律)存在父子關系,在程式啟動時,會創建一個RootLogger,它是所有Logger的根,其他的Logger默認會繼承RootLogger的Appender、Layout以及日志列印級別,這一點非常重要,在開發中我們一般只會在組態檔中配置RootLogger,其他的Logger繼承它就行,至于其他Logger,它們的繼承關系通過包的路徑來關聯,比如com.example的Logger繼承自com的Logger,
2.Log4j
log4j是log for java的簡稱,是Apache開源的一款日志列印框架,雖然其存在安全問題,已經很少使用,但是他的升級版本Log4j2,在安全和性能上都有了很大的提升,是現在的主流日志框架,因此還是有必要了解下,
入門案例
1. 引入log4j依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 撰寫組態檔
log4j會默認掃描classpath下的組態檔log4j.xml或log4j.properties,如果掃描不到組態檔,會報錯"No appenders could be found for logger",
#指定日志的輸出級別與輸出端 log4j.rootLogger=INFO,Console # 控制臺輸出配置 log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
3.撰寫Java代碼
public static void main(String[] args) {
Logger logger = Logger.getLogger(Log4jTest.class);
logger.fatal("fatal...");
logger.error("error...");
logger.warn("warn...");
logger.info("info...");
logger.debug("debug...");
logger.trace("trace...");
}
4.控制臺輸出
2022-10-23 16:56:52,478 [main] FATAL [org.log.Log4jTest] - fatal... 2022-10-23 16:56:52,478 [main] ERROR [org.log.Log4jTest] - error... 2022-10-23 16:56:52,479 [main] WARN [org.log.Log4jTest] - warn... 2022-10-23 16:56:52,479 [main] INFO [org.log.Log4jTest] - info...
組件
與jul類似,log4j也包含三個重要的組件:Logger、Appender以及Layout,其功能也類似,這里不再贅述,
組態檔
log4j的組態檔主要就是配置上面提到的Logger、Appender以及Layout組件,
Logger組件的配置:可按照下面的方式配置rootLogger,首先是日志級別,然后是Appender的名稱,可以配置多個Appender,之間用逗號隔開,
log4j.rootLogger=INFO,Console,File
Appender組件配置:根據輸出的位置不同,選擇不同的Appender,輸出至console,選擇org.apache.log4j.ConsoleAppender,輸出至檔案,選擇org.apache.log4j.DailyRollingFileAppender,log4j.appender.xxx,其中xxx代表在Appender名稱,與Logger配置中的名稱一致 log4j.appender.Console=org.apache.log4j.ConsoleAppender
Loayout組件配置:組態檔的輸出格式,一個Appender配置一個與之對應的Layout,
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
3.Logback
Logback是Log4j的創始人開發的另外一款日志列印框架,性能比Log4j好,也是Spring底層使用的默認日志列印實作,同時它完整實作了slf4j的API,可以輕松和slf4j對接,
入門案例
1.引入依賴
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
2.組態檔撰寫
logback會依次讀取以下型別組態檔:logback.groovy、logback-test.xml、logback.xml,如果均不存在會采用默認配置
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--日志輸出格式--> <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread]%-5level %msg%n"/> <!-- Appender: 設定日志資訊的去向,常用的有以下幾個 ch.qos.logback.core.ConsoleAppender (控制臺) ch.qos.logback.core.rolling.RollingFileAppender (檔案大小到達指定尺寸的時候產生一個新檔案) ch.qos.logback.core.FileAppender (檔案) --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!--輸出流物件 默認 System.out 改為 System.err--> <target>System.err</target> <!--日志格式配置--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${pattern}</pattern> </encoder> </appender> <!--用來設定某一個包或者具體的某一個類的日志列印級別、以及指定<appender>, --> <root level="ALL"> <appender-ref ref="console"/> </root> </configuration>
3.代碼撰寫
public static void main(String[] args) { Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class); //列印日志資訊 LOGGER.error("error"); LOGGER.warn("warn"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); }
4.測驗
2022-10-23 17:47:45.044 org.log.LogbackTest [main]ERROR error
2022-10-23 17:47:45.046 org.log.LogbackTest [main]WARN warn
2022-10-23 17:47:45.047 org.log.LogbackTest [main]INFO info
2022-10-23 17:47:45.047 org.log.LogbackTest [main]DEBUG debug
2022-10-23 17:47:45.047 org.log.LogbackTest [main]TRACE trace
4.Log4j2
Log4j2是Log4j的升級版,性能也比logback更強,是目前最主流的日志實作框架,
入門案例
1.添加依賴
<!-- Log4j2日志API -->
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> <!-- Log4j2 日志實作 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency>
2.組態檔
log4j2會默認掃描classpath下的log4j2.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L%m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
3.撰寫Java代碼
public static void main(String[] args) { Logger LOGGER = LogManager.getLogger(Log4j2Test.class); LOGGER.fatal("fatal"); LOGGER.error("error"); LOGGER.warn("warn"); LOGGER.info("info"); LOGGER.debug("debug"); LOGGER.trace("trace"); }
4.測驗
19:26:53.661 [main] [FATAL] org.log.Log4j2Test:10fatal 19:26:53.670 [main] [ERROR] org.log.Log4j2Test:11error 19:26:53.670 [main] [WARN ] org.log.Log4j2Test:12warn 19:26:53.670 [main] [INFO ] org.log.Log4j2Test:13info
異步日志
Log4j2支持異步列印日志,這也使得其性能得到很大提升,一共有兩種實作方式:一個是通過AsyncAppender,一個是通過AsyncLogger,在使用異步日志之前需要引入依賴:
<dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.4</version> </dependency>
二、日志門面
與日志實作不同,日志門面是提供給程式員的一套API,開發時,只需要面向介面編程,可以在不改變源代碼的情況下,更換日志實作,這一點,有點類似于JDBC介面和具體的資料庫實作之間的關系,
1.JCL(Jakarta Commons Logging)
是Apace提供的一套日志列印API介面(日志門面),開發人員可以面向JCL介面編程,JCL會自動掃描具體的日志實作類,實作業務代碼和具體的日志列印實作類解耦,目前已經基本被淘汰,

2.slf4j(simple logging facade for java)
SLF4J是目前市面上最流行的日志門面,現在的專案中,基本上都是使用SLF4J作為日志系統,SLF4J主要提供兩大功能:系結日志實作和日志橋接,
系結日志實作
系結日志實作簡單來說就是使用slf4j作為日志門面,使用其他的日志系統作為實作,開發人員面向slf4j介面編程即可,需要注意的是,有的日志實作早于slf4j出現,并沒有實作slf4j介面,針對這種場景,slf4j提供了對應的配接器,具體的依賴和適配關系如下圖:

使用時,需要引入slf4j-api和相應的實作(配接器),slf4j會自動掃面日志實作,決定使用哪個日志實作,
日志橋接
在開發中,還有一種常見的場景,就是不同的專案使用的日志系統可能不一樣,這樣維護起來不方便,為此slf4j提出日志橋接的概念,可以將所有的日志系統統一于slf4j,主要步驟如下:
1. 先去除之前老的日志框架的依賴
2. 添加SLF4J提供的橋接組件
3. 為專案添加SLF4J的具體實作
依賴關系圖如下:
三、SpringBoot中的日志系統
springboot 默認使用SLF4J作為日志門面,logback作為日志實作來記錄日志,

可以看到SpringBoot通過引入橋接器,將log4j、jul都轉換為SLF4J,最終logback作為日志實作,當然,要讓上面的想法生效,必須排除掉log4j、jul的實作依賴,
如果要使用log4j2作為實作,只需要排除logback依賴,添加log4j2依賴即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--排除logback--> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- 添加log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519035.html
標籤:其他
上一篇:快取 - 方法注解組件開發
下一篇:Lists.partition
