Spring Boot學習筆記--日誌

3、Spring Boot與日誌

一、日誌框架

市面上的日誌框架html

JUL、JCL、Jboos-logging、logback、log4j、slf4jjava

日誌門面(日誌的抽象層) 日誌實現
JCL、slf4j、jboss-logging log4j、JUL、log4j二、logback

左邊選擇一個facade,右邊選擇一個實現spring

日誌門面:slf4japache

日誌實現:logbackspringboot

Spring Boot:底層是Spring框架,Spring框架默認使用JCL,SpringBoot選用slf4j+logback框架

二、slf4j的使用

一、如何在系統中使用slf4j

之後開發的時候,日誌記錄方法的調用,不來直接調用日誌的實現類,而是調用日誌抽象層裏面的方法spring-boot

給系統裏面導入slf4j的jar和logback的實現jarspa

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

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

slf4j圖示:concrete-bindings日誌

每一個日誌的實現框架都有息怕配置文件,使用slf4j之後,配置文件仍是作成日誌實現框架本身自己的配置文件code

二、遺留問題

不一樣框架底層使用的是不一樣的日誌框架實現,須要統一日誌記錄

legacy

使用偷天換日包jcl-over-slf4j替換commons-logging,即避免了因缺乏依賴時框架報錯問題,又替換掉了commons-logging

總結:如何讓系統中全部的日誌都統一到slf4j?

  1. 將系統中其餘日誌框架先排除出去
  2. 用中間包來替換原有的日誌框架,如jcl-over-slf4j.jar
  3. 導入slf4j其餘的實現

三、Spring Boot日誌關係

SpringBoot使用下列starter管理日誌

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

使用下述依賴將其餘日誌框架轉換爲slf4j

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
        </dependency>

真實使用的日誌框架實現爲

<dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>

總結:

  1. Spring Boot底層使用slf4j+logback的方式進行日誌記錄
  2. SpringBoot把其餘的日誌都替換成了slf4j
  3. 中間替換包,底層實現時真正使用的是new SLF4JLogFactory();

    package org.apache.commons.logging;
    
    import java.util.Hashtable;
    import org.apache.commons.logging.impl.SLF4JLogFactory;
    
    public abstract class LogFactory {
        static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
        static LogFactory logFactory = new SLF4JLogFactory();
        ********
        ********
    }
  4. 若是要引入其餘框架,必定要把這個框架的默認日誌依賴都移除掉。Spring Boot排除掉了Spring框架使用的common-logging

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    SpringBoot能自動適配全部的日誌,並且底層使用slf4j+logback的方式記錄日誌,引入其餘框架時,須要把引入框架所依賴的日誌框架排除掉

四、日誌使用

一、默認配置

logging:
  level:
    com:
      meituan: trace
  #
  path: F:\workspace\springboot\springboot-logging\log\
  ## 格式化輸出日誌
  pattern:
    console: 
  # 沒有配置path時,在當前項目目錄下生成指定日誌文件
  #file: springboot.log

二、指定配置

給類路徑下放上每一個日誌框架本身的配置文件便可

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

Spring Boot推薦使用+spring後綴的配置文件

logback.xml:直接就被日誌框架識別了

logback-spring.xml:日誌框架就不直接加載日誌的配置項,由Spring Boot解析日誌配置,從而使用高級功能,例如能夠指定開發環境

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev, staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

五、 切換日誌框架

legacy

按照slf4j的日誌適配圖,進行相關的切換

相關文章
相關標籤/搜索