Log4j,Log4j2,logback,slf4j日誌學習

 

日誌學習筆記

Log4j

Log4j是Apache的一個開放源代碼項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、數據庫等;咱們也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。 
Log4j有7種不一樣的log級別,按照等級從低到高依次爲:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF。若是配置爲OFF級別,表示關閉log。 
Log4j支持兩種格式的配置文件:properties和xml。包含三個主要的組件:Logger、appender、Layout。java

控制檯輸出 
經過以下配置,設定root日誌的輸出級別爲INFO,appender爲控制檯輸出stdoutmysql

# LOG4J配置 log4j.rootLogger=INFO,stdout # 控制檯輸出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

輸出到文件 程序員

在開發環境,咱們只是輸出到控制檯沒有問題,可是到了生產或測試環境,或許持久化日誌內容,方便追溯問題緣由。能夠經過添加以下的appender內容,按天輸出到不一樣的文件中去,同時還須要爲log4j.rootLogger添加名爲file的appender,這樣root日誌就能夠輸出到logs/springboot.log文件中了。輸出到文件和輸出到控制檯是能夠並行存在的。web

# LOG4J配置 log4j.rootLogger=INFO,stdout,file # 日誌輸出到文件 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.file=logs/springboot.log log4j.appender.file.DatePattern='.'yyyy-MM-dd log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 

 

 

分類輸出 
當咱們日誌量較多的時候,查找問題會很是困難,經常使用的手段就是對日誌進行分類,好比: 
能夠按不一樣package進行輸出。經過定義輸出到logs/my.log的appender,並對com.test包下的日誌級別設定爲DEBUG級別、appender設置爲輸出到logs/my.log的名爲testlog的appender。spring

# com.test包下的日誌配置 log4j.logger.com.test=DEBUG, testlog # com.test下的日誌輸出 log4j.appender.testlog=org.apache.log4j.DailyRollingFileAppender log4j.appender.testlog.file=logs/my.log log4j.appender.testlog.DatePattern='.'yyyy-MM-dd log4j.appender.testlog.layout=org.apache.log4j.PatternLayout log4j.appender.testlog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

 

 

能夠對不一樣級別進行分類,好比對ERROR級別輸出到特定的日誌文件中,具體配置能夠以下:sql

# LOG4J配置 log4j.rootCategory=INFO, stdout,errorfile log4j.logger.error=errorfile # error日誌輸出 log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.errorfile.file=logs/error.log log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd log4j.appender.errorfile.Threshold = ERROR log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n %5p %c{1}:%L - %m%n

 

 

輸出到數據庫 
將日誌文件輸出到數據庫配置:數據庫

\# LOG4J配置 log4j.rootCategory=INFO,stdout,jdbc \# 數據庫輸出 log4j.appender.jdbc=org.apache.log4j.jdbc.JDBCAppender log4j.appender.jdbc.driver=com.mysql.jdbc.Driver log4j.appender.jdbc.URL=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=true log4j.appender.jdbc.user=root log4j.appender.jdbc.password=root log4j.appender.jdbc.sql=insert into log_icecoldmonitor(level,category,thread,time,location,note) values('%p','%c','%t','%d{yyyy-MM-dd HH:mm:ss:SSS}','%l','%m')

 

 

引入數據庫驅動:apache

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>

 

 

建立表:json

CREATE TABLE `log_icecoldmonitor` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `level` varchar(255) NOT NULL DEFAULT '' COMMENT '優先級', `category` varchar(255) NOT NULL DEFAULT '' COMMENT '類目', `thread` varchar(255) NOT NULL DEFAULT '' COMMENT '進程', `time` varchar(30) NOT NULL DEFAULT '' COMMENT '時間', `location` varchar(255) NOT NULL DEFAULT '' COMMENT '位置', `note` text COMMENT '日誌信息', PRIMARY KEY (`Id`) )

 

 

這樣就能夠保存到日誌到數據庫了,可能會出現以下異常信息: 
Java鏈接Mysql數據庫警告:Establishing SSL connection 
緣由是MySQL在高版本須要指明是否進行SSL鏈接。解決方案以下: 
在mysql鏈接字符串url中加入ssl=true或者false便可,以下所示。 
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=truespringboot

應用

  1. 引入log4j依賴 
    在建立Spring Boot工程時,咱們引入了spring-boot-starter,其中包含了spring-boot-starter-logging,該依賴內容就是Spring Boot默認的日誌框架Logback,因此咱們在引入log4j以前,須要先排除該包的依賴,再引入log4j的依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> </dependency>

 

 

值得注意的是,spring boot 1.3版本支持log4j,在spring boot 1.4的版本中,就須要使用log4j2,不然會出現以下錯誤:Project build error: 'dependencies.dependency.version' for org.springframework.boot:spring-boot-starter-log4j:jar is missing.

  1. 配置log4j-spring.properties 
    在引入了log4j依賴以後,只須要在src/main/resources目錄下加入log4j.properties(或log4j-spring.properties)配置文件,就能夠開始對應用的日誌進行配置使用。測試配置內容以下:
# DEBUG INFO WARN ERROR FATAL log4j.rootLogger = info,stdout,errorlogfile log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Threshold = info log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n log4j.appender.stdout.ImmediateFlush = true log4j.appender.errorlogfile = org.apache.log4j.DailyRollingFileAppender log4j.appender.errorlogfile.Threshold = INFO log4j.appender.errorlogfile.layout = org.apache.log4j.PatternLayout log4j.appender.errorlogfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n log4j.appender.errorlogfile.File = ../logs/testlog4j.log log4j.appender.errorlogfile.Append = true log4j.appender.errorlogfile.ImmediateFlush = true

 

 

  1. 配置application.properties 
    指定log配置文件
logging.config= classpath:log4j.properties
  • 1

在啓動類中進行測試

private static Logger logger = Logger.getLogger(TestLog4jApplication.class); public static void main(String[] args) { logger.info("log4j----------------\n"); SpringApplication.run(TestLog4jApplication.class, args); }

 

 

運行項目,便可看到控制檯打印出的日誌信息,同時在項目同級目錄下的logs/testlog4j.log中也會打印出比較詳盡的日誌信息。

Log4j2

Spring Boot1.4以及以後的版本已經不支持log4j,log4j也好久沒有更新了,如今已經有不少其餘的日誌框架對Log4j進行了改良,好比說SLF4J、Logback等。並且Log4j 2在各個方面都與Logback很是類似,那麼爲何咱們還須要Log4j 2呢? 
  1. 插件式結構。Log4j 2支持插件式結構。咱們能夠根據本身的須要自行擴展Log4j 2. 咱們能夠實現本身的appender、logger、filter。 
  2. 配置文件優化。在配置文件中能夠引用屬性,還能夠直接替代或傳遞到組件。並且支持json格式的配置文件。不像其餘的日誌框架,它在從新配置的時候不會丟失以前的日誌文件。 
  3. Java 5的併發性。Log4j 2利用Java 5中的併發特性支持,儘量地執行最低層次的加鎖。解決了在log4j 1.x中存留的死鎖的問題。 
  4. 異步logger。Log4j 2是基於LMAX Disruptor庫的。在多線程的場景下,和已有的日誌框架相比,異步的logger擁有10倍左右的效率提高。 
   
官方建議通常程序員查看的日誌改爲異步方式,一些運營日誌改爲同步。日誌異步輸出的好處在於,使用單獨的進程來執行日誌打印的功能,能夠提升日誌執行效率,減小日誌功能對正常業務的影響。異步日誌在程序的classpath須要加載disruptor-3.0.0.jar或者更高的版本。

<!-- log4j2異步日誌須要加載disruptor-3.0.0.jar或者更高的版本 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.6</version> </dependency>

異步日誌分爲兩種: 

a.全異步模式 
這種異步日誌方式,不須要修改修改原理的配置文件,Logger仍然使用<root> and <logger> 
只須要在主程序代碼開頭,加一句系統屬性的代碼:

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); 

b.異步和非異步混合輸出模式 

在配置文件中Logger使用<asyncRoot> or <asyncLogger>

<loggers> <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true"> <appender-ref ref="Console" /> <appender-ref ref="debugLog" /> <appender-ref ref="errorLog" /> </AsyncLogger> <asyncRoot level="trace" includeLocation="true"> <appender-ref ref="Console" /> </asyncRoot> </loggers> 

 

 

應用

  1. 引入log4j2依賴 
    在建立Spring Boot工程時,咱們引入了spring-boot-starter,其中包含了spring-boot-starter-logging,該依賴內容就是Spring Boot默認的日誌框架Logback,因此咱們在引入log4j2以前,須要先排除該包的依賴,再引入log4j2的依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>

 

 

  1. log4j2.xml配置 
    有一點須要注意的是,假如想要在application.properties中指定日誌文件存放路徑或日誌文件名,在log4j2.xml中使用${LOG_PATH}或者${LOG_FILE}來引用,是沒法獲取到的(在logback中能夠盡情使用)。log4j2支持xml、json、yaml等格式的配置文件。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Properties> <property name="LOG_PATH">../logs/</property> <property name="LOG_FILE">testlog4j2</property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout> <pattern>%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n</pattern> </PatternLayout> </Console> <RollingFile name="errorlogfile" fileName="${LOG_PATH}/${LOG_FILE}.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${LOG_FILE}-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout> <pattern>%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n</pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="50 MB" /> </Policies> <DefaultRolloverStrategy max="20" /> </RollingFile> </Appenders> <Loggers> <root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="errorlogfile" /> </root> </Loggers> </Configuration> 

 

 

  1. application.properties配置 
    指定log配置文件
logging.config= classpath:log4j2.xml
  • 1

在啓動類中進行測試

private static Logger logger = LogManager.getLogger(TestLog4j2Application.class); public static void main(String[] args) { logger.error("log4j2----------------\n"); SpringApplication.run(TestLog4j2Application.class, args); }

運行項目,便可看到控制檯打印出的日誌信息,同時在項目同級目錄下的logs/testlog4j2.log中也會打印出比較詳盡的日誌信息。

SLF4J

SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,而是經過Facade Pattern提供一些Java logging API,它只服務於各類各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,容許最終用戶在部署其應用時使用其所但願的日誌系統。做者建立SLF4J的目的是爲了替代Jakarta Commons-Logging。 
實際上,SLF4J所提供的核心API是一些接口以及一個LoggerFactory的工廠類。在使用SLF4J的時候,不須要在代碼中或配置文件中指定你打算使用那個具體的日誌系統。相似於Apache Common-Logging,SLF4J是對不一樣日誌框架提供的一個門面封裝,能夠在部署的時候不修改任何配置便可接入一種日誌實現方案。可是,他在編譯時靜態綁定真正的Log庫。使用SLF4J時,若是你須要使用某一種日誌實現,那麼你必須選擇正確的SLF4J的jar包的集合(各類橋接包)。SLF4J提供了統一的記錄日誌的接口,只要按照其提供的方法記錄便可,最終日誌的格式、記錄級別、輸出方式等經過具體日誌系統的配置來實現,所以能夠在應用中靈活切換日誌系統。

slf4j

那麼何時使用SLF4J比較合適呢? 
若是你開發的是類庫或者嵌入式組件,那麼就應該考慮採用SLF4J,由於不可能影響最終用戶選擇哪一種日誌系統。在另外一方面,若是是一個簡單或者獨立的應用,肯定只有一種日誌系統,那麼就沒有使用SLF4J的必要。假設你打算將你使用log4j的產品賣給要求使用JDK 1.8 Logging的用戶時,面對成千上萬的log4j調用的修改,相信這絕對不是一件輕鬆的事情。可是若是開始便使用SLF4J,那麼這種轉換將是很是輕鬆的事情。

應用

例如上述內容中,log4j測試,使用

import org.apache.log4j.Logger;

 

private static Logger logger = Logger.getLogger(TestLog4jApplication.class);

 

而在log4j2測試使用

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;

 

private static Logger logger = LogManager.getLogger(TestLog4j2Application.class);

 

假如後期改變log實現系統,全部調用log4j的代碼都須要進行修改,假如一開始都使用slf4j.Logger,後期將無需修改代碼。

import org.slf4j.Logger; import org.slf4j.LoggerFactory;

 

private static Logger logger = LoggerFactory.getLogger(TestLog4jApplication.class);

 

private static Logger logger = LoggerFactory.getLogger(TestLog4j2Application.class); 

 

假如遇到SLF4J: Class path contains multiple SLF4J bindings相關的錯誤提示,則是由於引入了多個日誌系統,須要排除多餘的依賴。

slf4j-simple是slf4j的一種日誌系統實現,目前最新版本是1.7.7。

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.7</version> </dependency>

 

 

Logback

Logback,一個「可靠、通用、快速而又靈活的Java日誌框架」。logback當前分紅三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個改良版本。此外logback-classic完整實現SLF4J API使你能夠很方便地更換成其它日誌系統如log4j或JDK Logging。logback-access訪問模塊與Servlet容器集成提供經過Http來訪問日誌的功能。 
1. logback-core: Joran, Status, context, pattern parsing 
2. logback-classic: developer logging 
3. logback-access: The log generated when a user accesses a web-page on a web server. Integrates seamlessly with Jetty and Tomcat.

選擇logback的理由: 
1. logback比log4j要快大約10倍,並且消耗更少的內存。 
2. logback-classic模塊直接實現了SLF4J的接口,因此咱們遷移到logback幾乎是零開銷的。 
3. logback不只支持xml格式的配置文件,還支持groovy格式的配置文件。相比之下,Groovy風格的配置文件更加直觀,簡潔。 
4. logback-classic可以檢測到配置文件的更新,而且自動從新加載配置文件。 
5. logback可以優雅的從I/O異常中恢復,從而咱們不用從新啓動應用程序來恢復logger。 
6. logback可以根據配置文件中設置的上限值,自動刪除舊的日誌文件。 
7. logback可以自動壓縮日誌文件。 
8. logback可以在配置文件中加入條件判斷(if-then-else)。能夠避免不一樣的開發環境(dev、test、uat…)的配置文件的重複。 
9. logback帶來更多的filter。 
10. logback的stack trace中會包含詳細的包信息。 
11. logback-access和Jetty、Tomcat集成提供了功能強大的HTTP-access日誌。 
配置文件:須要在項目的src目錄下創建一個logback.xml。 
注:(1)logback首先會試着查找logback.groovy文件; 
(2)當沒有找到時,繼續試着查找logback-test.xml文件; 
(3)當沒有找到時,繼續試着查找logback.xml文件; 
(4)若是仍然沒有找到,則使用默認配置(打印到控制檯)。

logback的一些配置介紹: 
* 控制檯輸出 
在Spring Boot中默認配置了ERROR、WARN和INFO級別的日誌輸出到控制檯。咱們能夠經過兩種方式切換至DEBUG級別: 
在運行命令後加入–debug標誌,如:$ java -jar test.jar --debug 
在application.properties中配置debug=true,該屬性置爲true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,可是你本身應用的日誌並不會輸出爲DEBUG級別。

  • 多彩輸出 
    若是你的終端支持ANSI,設置彩色輸出會讓日誌更具可讀性。經過在application.properties中設置spring.output.ansi.enabled參數來支持。 
    NEVER:禁用ANSI-colored輸出(默認項) 
    DETECT:會檢查終端是否支持ANSI,是的話就採用彩色輸出(推薦項) 
    ALWAYS:老是使用ANSI-colored格式輸出,若終端不支持的時候,會有不少干擾信息,不推薦使用

  • 文件輸出 
    Spring Boot默認配置只會輸出到控制檯,並不會記錄到文件中,可是咱們一般生產環境使用時都須要以文件方式記錄。 
    若要增長文件輸出,須要在application.properties中配置logging.file或logging.path屬性。 
    logging.file,設置文件,能夠是絕對路徑,也能夠是相對路徑。如:logging.file=my.log 
    logging.path,設置目錄,會在該目錄下建立spring.log文件,並寫入日誌內容,如:logging.path=../logs 
    日誌文件會在10Mb大小的時候被截斷,產生新的日誌文件,默認級別爲:ERROR、WARN、INFO

  • 級別控制 
    在Spring Boot中只須要在application.properties中進行配置完成日誌記錄的級別控制。 
    配置格式:logging.level.*=LEVEL 
    logging.level:日誌級別控制前綴,*爲包名或Logger名 
    LEVEL:選項TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF 
    舉例: 
    logging.level.com.test=DEBUG:com.test包下全部class以DEBUG級別輸出 
    logging.level.root=WARN:root日誌以WARN級別輸出

  • 自定義輸出格式 
    在Spring Boot中能夠經過在application.properties配置以下參數控制輸出格式: 
    logging.pattern.console:定義輸出到控制檯的樣式(不支持JDK Logger) 
    logging.pattern.file:定義輸出到文件的樣式(不支持JDK Logger)

應用

logback是Spring Boot默認的日誌系統,假如對日誌沒有特殊要求,能夠徹底零配置使用 SLF4J(Simple Logging Facade For Java)的logback來輸出日誌。

package com.jianeye.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class TestApplication { private static Logger logger = LoggerFactory.getLogger(TestApplication.class); public static void main(String[] args) { logger.warn("logback --------------------------------\n"); SpringApplication.run(TestApplication.class, args); logger.info("default log system *************************\n"); } }

 

 

Spring Boot也支持自定義日誌配置,有如下兩種方式。 
1. 在 src/main/resources 下面建立logback.xml (根據不一樣環境來定義不一樣的日誌輸出,那麼取名爲logback-spring.xml 便可)文件,並按需求進行配置。

logback-spring.xml 文件:

<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <logger name="org.springframework.web" level="INFO"/> <logger name="org.springboot.sample" level="TRACE" /> <springProfile name="dev"> <logger name="org.springboot.sample" level="DEBUG" /> </springProfile> <springProfile name="staging"> <logger name="org.springboot.sample" level="INFO" /> </springProfile> </configuration>

 

 

  1. 使用最簡單的方法,在 application 配置文件中配置。 
logging: config: classpath:logback-spring.xml file: cuckoo3 path: /cuckoo3-log/logs level: com.jianeye.cuckoo3.webside: DEBUG

 

 

須要注意幾點: 
1. 這裏若不配置具體的包的日誌級別,日誌文件信息將爲空 
2. 若只配置logging.path,那麼將會在E:\logs文件夾生成一個日誌文件爲spring.log 
3. 若只配置logging.file,那將會在項目的當前路徑下生成一個demo.log日誌文件 
4. logging.path和logging.file同時配置,不會有在這個路徑有E:\logs\demo.log日誌生成,logging.path和logging.file不會進行疊加 
5. logging.path和logging.file的value均可以是相對路徑或者絕對路徑

Apache Commons Logging

Apache Commons Logging ,以前叫 Jakarta Commons Logging(JCL)提供的是一個日誌(Log)接口(interface),同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中間件/日誌工具開發者一個簡單的日誌操做抽象,容許程序開發人員使用不一樣的具體日誌實現工具。用戶被假定已熟悉某種日誌實現工具的更高級別的細節。JCL提供的接口,對其它一些日誌工具,包括Log4J, Avalon LogKit, and JDK 1.4+等,進行了簡單的包裝,此接口更接近於Log4J和LogKit的實現。 
common-logging是apache提供的一個通用的日誌接口。用戶能夠自由選擇第三方的日誌組件做爲具體實現,像log4j,或者jdk自帶的logging, common-logging會經過動態查找的機制,在程序運行時自動找出真正使用的日誌庫。固然,common-logging內部有一個Simple logger的簡單實現,可是功能很弱。因此使用common-logging,一般都是配合着log4j來使用。使用它的好處就是,代碼依賴是common-logging而非log4j, 避免了和具體的日誌方案直接耦合,在有必要時,能夠更改日誌實現的第三方庫。 
使用common-logging的常見代碼:

import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class A { private static Log logger = LogFactory.getLog(this.getClass()); } 

 

 

slf4j 與 common-logging 比較 
common-logging經過動態查找的機制,在程序運行時自動找出真正使用的日誌庫; 
slf4j在編譯時靜態綁定真正的Log庫。

java.util.logging.Logger

java.util.logging.Logger(JUL),JDK自帶的日誌系統,從JDK1.4就有了。關鍵元素包括: 
Logger:應用程序進行logging調用的主要實體。Logger 對象用來記錄特定系統或應用程序組件的日誌消息。 
LogRecord:用於在 logging 框架和單獨的日誌處理程序之間傳遞 logging 請求。 
Handler:將 LogRecord 對象導出到各類目的地,包括內存、輸出流、控制檯、文件和套接字。爲此有各類的 Handler 子類。其餘 Handler 可能由第三方開發並在核心平臺的頂層實現。 
Level:定義一組能夠用來控制 logging 輸出的標準 logging 級別。能夠配置程序爲某些級別輸出 logging,而同時忽略其餘輸出。 
Filter:爲所記錄的日誌提供日誌級別控制之外的細粒度控制。Logging API 支持通用的過濾器機制,該機制容許應用程序代碼附加任意的過濾器以控制 logging 輸出。 
Formatter:爲格式化 LogRecord 對象提供支持。此包包括的兩個格式化程序 SimpleFormatter 和 XMLFormatter 分別用於格式化純文本或 XML 中的日誌記錄。與 Handler 同樣,其餘 Formatter 可能由第三方開發。

整個JVM內部全部logger的管理,logger的生成、獲取等操做都依賴於LogManager,也包括配置文件的讀取,LogManager與logger是1對多關係,整個JVM運行時只有一個LogManager,且全部的logger均在LogManager中。 
logger與handler是多對多關係,logger在進行日誌輸出的時候會調用全部的hanlder進行日誌的處理。 
handler與formatter是一對一關係,一個handler有一個formatter進行日誌的格式化處理。 
logger與level是一對一關係,hanlder與level也是一對一關係 。 
JDK默認的logging配置文件爲:$JAVA_HOME/jre/lib/logging.properties,可使用系統屬性java.util.logging.config.file指定相應的配置文件對默認的配置文件進行覆蓋。

小結

從下圖中,咱們能夠看到4部分。

logs

接口:將全部日誌實現適配到了一塊兒,用統一的接口調用。  
實現:目前主流的日誌實現  
舊日誌到slf4j的適配器:若是使用了slf4j,可是隻想用一種實現,想把log4j的日誌體系也從logback輸出,這個是頗有用的。  
slf4j到實現的適配器:若是想制定slf4j的具體實現,須要這些包。 

slf4j跟commons-logging相似,是各類日誌實現的通用入口,log4j、log4j二、logback、slf4j-simple和java.util.logging是比較常見的日誌實現系統,目前應用比較普遍的是Log4j和logback,而logback做爲後起之秀,以替代log4j爲目的,總體性能比log4j較佳,log4j的升級版log4j2也是有諸多亮點,用戶能夠根據項目需求和我的習慣,選擇合適的日誌實現。

注:學習所用,大部份內容摘抄自網絡各類大師總結,在此感謝!

相關文章
相關標籤/搜索