SpringBoot入門實踐(五)-開源日誌框架介紹

 個人博客:蘭陵笑笑生,歡迎瀏覽博客!java

 上一章 SpringBoot入門實踐(四)-RESTFUL API 最佳設計當中,咱們介紹了在SpringBoot項目中如何規範的使用RESTful風格的API,。本章簡單介紹一下經常使用的開源日誌框架。web

前言

 日誌是程序設計中很重要的一部分,固然在我剛接觸編程的時候,是不怎麼在乎的,正好有空概括總結一下。spring

  在JDK1.4版本以後纔有JDK Logger,不過JDK的日誌太雞肋,這裏不過多介紹,開源社區當中應用比較普遍的是Apache Commons Logging和Apache Log4j ,Apache Commons Logging是通用的日誌API ,Apache Log4j纔是很流行的日誌實現。後來Slf4j和Logback取代了Apache Commons Logging和Apache Log4j 。數據庫

1、Apache Commons Logging

  • 簡介:

  Apache Commons Logging 提供了日誌的接口,具體的實現根據配置動態調整,它的出現避免了和具體日誌實現框架的直接耦合,在平常開發中,能夠選擇第三方的日誌:’apache

file

  • 使用方式

    pom.xml引入編程

<dependency>     
    <groupId>commons-logging</groupId>   
    <artifactId>commons-logging</artifactId>     
    <version>1.1.1</version> 
</dependency>
package test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
public class CommonLogDemo {    
    private Log log=LogFactory.getLog(CommonLogDemo.class); 
    @Test    
    public void test(){   
        log.debug("debug .....");  
        log.info("info .....");      
        log.warn("warn .....");   
        log.error("error .....");    
        log.fatal("fatal .....");  
    }
}

resource目錄下添加commons-logging.properties,若是單純的使用commons-logging,默認的日誌對象就是Jdk14Logger,工廠就是LogFactoryImplsegmentfault

#指定日誌對象
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#指定工廠
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl

2、Apache Log4j

  • 簡介

  Log4j是java編寫的可靠的、靈活的日誌框架,經過使用Log4j 咱們可以方便的記錄日誌,不但弄控制日誌的輸出,還能控制日誌的輸出格式:性能優化

file

日誌級別:

ALL、 DEBUG 、INFO 、WARN、 ERROR、 FATAL 、OFFapp

Appender :

日誌的輸出地方框架

經常使用的包括

  • ConsoleAppender控制檯
  • FileAppender 文件
  • RollingFileAppender 滾動
  • DailyRollingFileAppender

固然還能夠寫入數據庫,異步打印等等高級功能。

file

Layout

格式化

  • HTMLLayout XML形式輸出
  • PatternLayout 使用自定義的格式輸出
  • SimpleLayout 只包含日誌信息的級別和信息字符串
  • TTCCLayout 包括時間、線程,類別等

通常用都是自定義用的比較多PatternLayout

  • 使用方式

public class LoggerDemo {  
    org.apache.log4j.Logger log= org.apache.log4j.Logger.getLogger(LoggerDemo.class);    @Test   
 public void  test(){    
     log.trace("trace log ...");  
     log.debug("debug log ...");   
     log.info("info log ...");   
     log.warn("warn log ...");     
     log.error("error log ...");   
 }

}

在resource目錄下添加log4j.properties或者log4j.xml log4j會自動解析

log4j.properties

log4j.rootLogger=INFO, FILE,CONSOLE
#配置輸出到控制檯#1 ConsoleAppender控制檯  2FileAppender 文件  3  RollingFileAppender 滾動  4 DailyRollingFileAppender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.ImmediateFlush=truelog4j.appender.CONSOLE.Threshold=DEBUG
#layout對日誌格式化# 1自定義格式,PatternLayout2
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.encoding=UTF-8
##格式  : %時間 [%線程] %log級別 %完整類名 - %消息 %換行
#%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyyy MMM dd 
#HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921
#%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL#%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數
#%c 輸出所屬的類目,一般就是所在類的全名
#%L 代碼中的行數。
#%m 輸出代碼中指定的消息
# 輸出一個回車換行符,Windows平臺爲「rn」,Unix平臺爲「n」
log4j.appender.CONSOLE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L- %m%n
#配置輸出到文件
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=D:\\log\\log.log
log4j.appender.FILE.ImmediateFlush=truelog4j.appender.FILE.Threshold=DEBUGlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.encoding=UTF-8
log4j.appender.FILE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L- %m%n
  • Log4j的鎖和性能優化

​  一般來講,打日誌總比不打印日誌要好,產生問題是有據可查,可是存在太多的日誌,會使服務性能降低。,Log4J默認的Apperders使用同步的鎖來實現。

  • 日誌事件異步打印
  • 可使用Log4j 的 AsyncAppender來實現異步打印,
  • springBoot修改底層日誌爲log4j

第一步:添加springBoot的log4j依賴

<dependency>   
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-log4j</artifactId>  
  <version>1.3.8.RELEASE</version>
</dependency>

第二步 :排除springBoot默認的logging

<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>

第三步:resourece目錄下添加log4j.properties文件或者log4j.xml

3、Slf4j(Simple Logging Facade for Java)

  • 簡介

 和Apache Commons Logging,使用門面模式對外提供統一的接口,應用程序只依賴於Slf4j來實現打印日誌,

具體的日誌實現由配置來決定使用Log4j仍是Logback,在不改變應用代碼前提下,切換底層的日誌實現。

springBoot就是實現了這種方式,底層使用slf4j+logback的方式進行日誌記錄 :

file

 Slf4j任然使用了門面模式,相對於Commons Logging作了一些優化,它在編譯的時候肯定底層的實現,而不是經過配置文件動態的狀態底層的實現。,因此只要底層的日誌實現的jar包和Slf4j的靜態編譯轉換包在類路徑下便可。

 從圖上咱們能夠看到Slf4j的實現結構,除了Logger和LoggerFactory還有一個LoggerFactoryBinder,主要是實現轉接器。

 什麼意思呢,就是Slf4j對每一種日誌實現的框架都提供了一個轉換的Jar包,這個Jar包包含了LoggerFactoryBinder接口的實現,好比:Logback轉接的Jar包就是logback-classic-1.0.13.jar,提供了LoggerFactoryBinder的實現

  • SLF4J對不一樣日誌的轉接包

file

  • 在springBoot中

  • 底層使用slf4j+logback的方式進行日誌記錄
  • 其餘日誌會轉換成slf4j

看看spring-boot-start-logging的依賴

file

springBoot當中的spring-boot-start-logging默認引入

4、Logback

  • 簡介

 Logback是由Log4j的創始人設計的另外一個日誌組件,它也是目前首選的主流日誌記錄工具。

咱們所學習的springBoot就是默認使用Locback+Slf4j。

logback 分爲3個部分

  1. logback-core:是如下2個模塊的基礎,包括日誌的實現
  2. logback-classic :是Log4j的改良版本,在性能方面有較大的提升,並實現了上文說到的接口。
  3. logback-access:與Servlet集成,提供了豐富的Http訪問日誌功能
  • logback-classic結構:

file

  • 使用方式

package test;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackDemo { 
    Logger logger = LoggerFactory.getLogger(LogbackDemo.class);  
    @Test    
    public void Loback() { 
        logger.debug("debug ..."
                    );  
        logger.info("info ...");
        logger.error("info ...");  
        logger.warn("info ..."); 
    }

}

在resource目錄下添加logback.xml配置

<?xml version="1.0" encoding="UTF-8"?><configuration>   
    <!-- <include resource="org/springframework/boot/logging/logback/base.xml"/>    -->   
    <!--自定義的pattern屬性--> 
    <property name="pattern"
              value="%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger] %msg%n "/>  
    <!--控制檯輸出-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
        <encoder>        
            <pattern>${pattern}</pattern>  
            <charset>GBK</charset>    
        </encoder>    
    </appender>  
    <!--滾動記錄日誌-->  
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!--當前生成的日誌文件名稱-->     
        <file>D:\\log\\logback.out</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <!--根據時間記錄日誌-->         
            <fileNamePattern>test-log-%d{yyyy-MM-dd}.log</fileNamePattern>         
            <!--歸檔日誌30天-->         
            <maxHistory>30</maxHistory>  
        </rollingPolicy>      
        <encoder>         
            <pattern>${pattern}</pattern>    
            <charset>GBK</charset>     
        </encoder>   
    </appender> 
    
    <logger name="org.springframework.web" level="INFO"/> 
    <!--根root logger 配置-->  
    <logger name="test" level="DEBUG">    
        <appender-ref ref="STDOUT"/>     
        <appender-ref ref="FILE"/>
    </logger>

</configuration>

Logback相對於Log4j的最大提高是效率,在關鍵的執行路徑上性能提高了至少10倍。同步記錄日誌大概是1.5萬/s的吞吐量。

5、總結

 以上就是本期的分享,你還能夠關注本博客的#Spring Boot入門實踐系列!#

本文由博客一文多發平臺 OpenWrite 發佈!
個人博客[蘭陵笑笑生] ( http://www.hao127.com.cn/),歡...
相關文章
相關標籤/搜索