第四篇 : SpringBoot 日誌

第四篇 : SpringBoot 日誌

日誌框架

市面上的日誌框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j ... 

日誌門面 日誌實現
JUL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging Log4j JUL(java.util.logging) Log4j2 Logback

劃線的是我們開發中不常用的,所以我們首選的日誌框架是SLF4j,log4j性能問題,所以其作者開發了新的 logback;log4j2是apache開的的日誌框架,性能很好,但是現在市面上用它的還比較少,我們若使用可能會出現兼容問題,所以我們開發中一般的選擇是:
日誌門面:SLF4j
日誌實現:logback
SpringBoot:底層是Spring框架,Spring框架默認是用JCL;SpringBoot對其進行了包裝,Srping Boot選用 SLF4j和logback。

SLF4j

1、如何在系統中使用SLF4j

以後我們開發的時候,日誌記錄方法的調用,不應該直接掉用日誌的實現類,而是調用日誌抽象層裏的方法。首先要給系統導入slf4j的jar 和 logback的實現jar

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");    }
}

2、日誌框架適配SLF4j的圖解

每個日誌的實現框架都有自己的配置文件,使用slf4j以後,配置文件還是用日誌實現框架自己本身的配置文件

3、統一日誌框架

1.問題

實際開發中項目可能是整合了很多框架例如 Spring(commons-logging)、Hibernate(jboss-logging)等等
我們怎麼統一使用slf4j進行輸出 ?

2.統一日誌框架圖解

讓系統中所有的日誌都統一到slf4j:
1、將系統中的其他日誌框架先排除出去
2、用中間包來替換原有的日誌框架
3、我們導入slf4j其他的實現 

4、SpringBoot日誌關係

1.pom.xml

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

2.底層依賴關係圖

3.總結

  • SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄

  • SpringBoot把其他的日誌替換成了slf4j

日誌的使用

1、默認配置

SpringBoot默認幫我配置好了日誌. 

package com.gf;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootLoggingApplicationTests {    //日誌記錄器    Logger logger = LoggerFactory.getLogger( this.getClass() );    @Test    public void contextLoads() {        //日誌級別(由高到底):trace < debug < info < warn < error        //可以調整輸出的日誌級別,日誌只會在這個級別以後的高級別生效        logger.trace( "這是trace日誌..." );        logger.warn( "這是warn日誌..." );        logger.debug( "這是error日誌..." );        //SpringBoot默認給我們使用的是info級別,沒有指定級別就使用SpringBoot默認的規定        logger.info( "這是error日誌..." );        logger.warn( "這是error日誌..." );        logger.error( "這是error日誌..." );    }
}
日誌輸出格式: 
    %d表示日期時間,
    %thread表示線程名,
    %‐5level:級別從左顯示5個字符寬度
    %logger{50} 表示logger名字最長50個字符,否則按照句點分割。 %msg:日誌消息,
    %n是換行符
    ‐‐>
    %d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n

2、修改SpringBoot日誌的默認配置

logging.level.com.gf=trace

#logging.path 和 logging.path 是衝突設置 ,兩者都設置時只有 logging.path 起作用
#指定文件名,就在項目下生產springboot.log日誌
#logging.file=springboot.log

# 在當前磁盤路徑下創建spring文件夾和裏面的log文件夾;使用spring.log 作爲默認文件
logging.path=/Users/huanchu/Documents/spring/log

# 指定控制檯輸出的日誌格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} -%msg%n

# 指定文件中日誌輸出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === %msg%n

3、logback.xml指定配置

<?xml version="1.0" encoding="UTF-8"?><!--
scan:當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">    <!-- 定義日誌的根目錄 -->    <property name="LOG_HOME" value="log" />    <!-- 定義日誌文件名稱 -->    <property name="appName" value="springboot-logging"></property>    <!-- ch.qos.logback.core.ConsoleAppender 表示控制檯輸出 -->    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">        <!--        日誌輸出格式:            %d表示日期時間,            %thread表示線程名,            %-5level:級別從左顯示5個字符寬度            %logger{50} 表示logger名字最長50個字符,否則按照句點分割。            %msg:日誌消息,            %n是換行符        -->        <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>        </layout>    </appender>    <!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!-- 指定日誌文件的名稱 -->        <file>${LOG_HOME}/${appName}.log</file>        <!--        當發生滾動時,決定 RollingFileAppender 的行爲,涉及文件移動和重命名        TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。        -->        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <!--            滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日誌滾動            %i:當文件大小超過maxFileSize時,按照i進行文件滾動            -->            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>            <!--            可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,            且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是,            那些爲了歸檔而創建的目錄也會被刪除。            -->            <MaxHistory>365</MaxHistory>            <!--            當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日誌文件滾動 注意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy            -->            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                <maxFileSize>100MB</maxFileSize>            </timeBasedFileNamingAndTriggeringPolicy>        </rollingPolicy>        <!-- 日誌輸出格式: -->        <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>        </layout>    </appender>    <!--        logger主要用於存放日誌對象,也可以定義日誌類型、級別        name:表示匹配的logger類型前綴,也就是包的前半部分        level:要記錄的日誌級別,包括 TRACE < DEBUG < INFO < WARN < ERROR        additivity:作用在於children-logger是否使用 rootLogger配置的appender進行輸出,        false:表示只用當前logger的appender-ref,true:        表示當前logger的appender-ref和rootLogger的appender-ref都有效    -->    <!--hibernate logger-->    <logger name="com.gf" level="debug" />    <!-- Spring framework logger -->    <!--<logger name="org.springframework" level="debug" additivity="false"></logger>-->    <!--    root與logger是父子關係,沒有特別定義則默認爲root,任何一個類只會和一個logger對應,    要麼是定義的logger,要麼是root,判斷的關鍵在於找到這個logger,然後判斷這個logger的appender和level。    -->    <root level="info">        <appender-ref ref="stdout" />        <appender-ref ref="appLogAppender" />    </root>
</configuration>

配置文件命名爲logback.xml時,直接被日誌框架識別。如果我們把文件名更改成logback-spring.xml,這樣就不會被日誌框架直接識別,這樣配置文件就由SpringBoot加載,就可以使用SpringBoot的一些高級功能:

<!-- 可以指定某段配置只在某個環境下生效 -->
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

例如:

<!-- 設置不同環境下日誌的打印格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">    <springProfile name="dev">        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ----> %-5level %logger{50} - %msg%n</pattern>    </springProfile>    <springProfile name="test">        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ===== [%thread] ===== %-5level %logger{50} - %msg%n</pattern>    </springProfile>    <springProfile name="test">        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>    </springProfile>
</layout>


本文分享自微信公衆號 - 程序員果果(huanchuguofupk_gz)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章