Spring Boot Log 日志使用教程


我們編寫任何 Spring Boot 程序,可能繞不開的就是 log 日志框架(組件)。
在大多數程序員眼中日志是用來定位問題的。這很重要。

本項目源碼下載 注意本項目提供的源碼已在后期重新編寫,有部分日期描述不一致。

如果你只是想知道 Spring boot log 如何使用,請直接觀看 3.2 使用 Spring Boot Logback

1 Log 日志概述

1.1 Log 日志組件能干什么

日志能干的事情很多,對於學習程序,測試的工程師來說,日志能夠定位問題,解決問題,是最大的功能點。

  1. 記錄一切 日志幫助我們記錄程序功能都干了什么,無論是正常的輸入輸出還是出現異常,都可以用日志記錄
  2. 定位問題 日志可以幫助程序員調試問題,幫助測試人員定位問題
  3. 記錄分析用戶行為 統計分析師用來記錄用戶的一起行為,用於分析用戶的習慣和商業價值
  4. 備份和還原實時數據 數據庫工程師用來作為一種特殊的數據庫

日志組件能干什么

1.2 日志的級別 Log Level

日志級別是對日志記錄信息的輕重緩急的划分。通常從輕到重划分為:

  1. TRACE
  2. DEBUG
  3. INFO
  4. WARN
  5. ERROR

日志的級別

通常當我們指定日志級別為 INFO 級別,那么 TRACE DEBUG 級別的日志就不會被輸出打印,同理如果指定日志級別為 ERROR,那么其他類型的日志將不會被打印。

1.3 日志的輸出 Log Import

通常日志以文本流的形式存儲在磁盤,也可以把日志存儲在關系型數據庫中或 No Sql 中

  1. 文本
  2. 關系型數據庫
  3. No Sql
  4. Console 控制台

一般日志組件都可以自定義輸出格式。

1.4 Spring Boot 日志組件 Log Plugin

當然自己開發日志組件也是可以的,實際上也不是很難,在一些特殊場景,很多公司都是用自己開發的日志組件,但是對於大多數應用來說,我們使用標准的日志組件就可以解決我們的問題。

Spring Boot 日志組件最為常見的包括了

  1. Logback Spring Boot 約定的默認配置
  2. log4j
  3. log4j2
  4. slf4j
  5. JUL

大部分場景我們都是推薦 Spring Boot 自帶的日志 logback

很多無良媒體直接抓取文章又不寫明來源,我是 fishpro程序魚,本文作者。

2 Spring Boot Logback

3.1 關於 Logback

在 Spring Boot 中,logback 是基於 slf4j 實現的。

slf4j的全稱是Simple Loging Facade For Java,即它僅僅是一個為Java程序提供日志輸出的統一接口,並不是一個具體的日志實現方案,他能夠實現大部分 日志組件。

slf4j接口

如上圖所示,logback 中使用了 slf4j,logback-classic.jar,logback-core.jar 實現了 logback 日志功能。

3.2 生成一個用於測試的 Spring Boot 項目

使用IDEA創建項目,其實也是從 (https://start.spring.io/ ) 創建,只是更為方便,我們一般采用從IDEA創建Spring Boot項目。

注意mac和windows的IDEA創建過程是一樣的。

1)File>New>Project,如下圖選擇Spring Initializr 然后點擊 【Next】下一步

2)填寫GroupId(包名)、Artifact(項目名) 即可。點擊 下一步

  • groupId=com.fishpro
  • artifactId=log

3)選擇依賴 Spring Web Starter 前面打鈎

4)項目名設置為 spring-boot-study-log

5)編寫個簡單的示例,可以看出使用日志組件非常的簡單

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LogApplication {

    public static void main(String[] args) {
        Logger logger =LoggerFactory.getLogger(LogApplication.class);
        SpringApplication.run(LogApplication.class, args);
        logger.debug("This is a debug message");//注意 spring 默認日志輸出級別為 info 所以默認情況下 這句不會打印到控制台
        logger.info("This is an info message");
        logger.warn("This is a warn message");
        logger.error("This is an error message");
    }

}

運行可以看到輸出了 hello world

2019-07-10 23:51:49.225  INFO 3906 --- [           main] com.fishpro.log.LogApplication           : Started LogApplication in 1.688 seconds (JVM running for 2.317)
2019-07-10 23:51:49.226  INFO 3906 --- [           main] com.fishpro.log.LogApplication           : This is an info message
2019-07-10 23:51:49.227  WARN 3906 --- [           main] com.fishpro.log.LogApplication           : This is a warn message
2019-07-10 23:51:49.227 ERROR 3906 --- [           main] com.fishpro.log.LogApplication           : This is an error message

3.3 依賴配置 Pom.xml

看到網上不少人貼出了 logback 的依賴配置,實際上從依賴包中可以看出,默認是不需要單獨配置 logback 依賴的。不需要單獨配置、不需要單獨配置、不需要單獨配置

3.4 使用 YML 配置 logback

3.4.1 編寫一個 Controller 層類作為測試用 IndexController


@Controller
public class IndexController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @RequestMapping("/")
    String index(){
        logger.debug("This is a debug message");
        logger.info("This is an info message");
        logger.warn("This is a warn message");
        logger.error("This is an error message");
        return "index";
    }
}

在瀏覽器中執行 http://locahost:8081/
輸出日志

如上圖,我們沒有 DEBUG 的日志,也就是說 logger.debug("This is a debug message"); 沒有被輸出到控制台。

實際上,Spring Boot 是一種約定大於配置,也就是說,他本身有一個配置文件叫 base.xml ,在這個配置文件里面,已經默認配置了輸出的日志級別 讓我們來看看 base.xml ,如下面的 xml 代碼所示,root level="INFO" 已經定義了日志輸出級別為 INFO 。這就是為什么,我看到控制台沒有輸出 DEBUG 那條日志。

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
  <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
  <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
  <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
  <root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
  </root>
</included>

3.4.2 在 application.yml 中配置

如下配置,設置level的級別為 DEBUG

logging:
  level:
    com.fishpro.log: debug

在瀏覽器中執行 http://locahost:8081/ 輸出如下日志 可以看出已經有了 DEBUG 日志

2019-07-08 12:51:30.423  INFO 36966 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-07-08 12:51:30.423  INFO 36966 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-07-08 12:51:30.428  INFO 36966 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
2019-07-08 12:51:30.447 DEBUG 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController         : This is a debug message
2019-07-08 12:51:30.447  INFO 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController         : This is an info message
2019-07-08 12:51:30.448  WARN 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController         : This is a warn message
2019-07-08 12:51:30.448 ERROR 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController         : This is an error message

3.4.3 在 application.yml 詳細配置

如下配置代碼,指定了日志的輸出級別、日志存儲路徑和輸出的格式。

logging:
  #level 日志等級 指定命名空間的日志輸出
  level:
    com.fishpro.log: debug
  #file 指定輸出文件的存儲路徑
  file: logs/app.log
  #pattern 指定輸出場景的日志輸出格式
  pattern:
    console: "%d %-5level %logger : %msg%n"
    file: "%d %-5level [%thread] %logger : %msg%n"

在瀏覽器中執行 http://locahost:8081/

00:08:15 [reactor-http-nio-2] DEBUG com.fishpro.log.LogApplication - This is a debug message
00:08:15 [reactor-http-nio-2] INFO  com.fishpro.log.LogApplication - This is an info message
00:08:15 [reactor-http-nio-2] WARN  com.fishpro.log.LogApplication - This is a warn message
00:08:15 [reactor-http-nio-2] ERROR com.fishpro.log.LogApplication - This is an error message

同時我們可以看到在項目根路徑下多處理 logs 文件夾,下面有 app.log 文件,app.log 文件同時記錄了日志的輸出。

3.4.4 不同環境中配置

我們可以在 devprodtest 等環境中配置不同的 log 配置項目,我們只需要根據我們的配置文件來設置即可。

關於如何在 Spring Boot 中配置不同的環境實現 開發環境(dev)、測試環境(test)、生成環境(prod)分離,請參考Spring Boot 中多環境配置

3.5 使用 logback-spring.xml 來配置 logback 日志

如果需要更為詳細的自定義 logback 日志,那么我們需要使用 xml 配置文件來配置。

使用 logback-spring.xml 來自定義日志的配置,主要需要了解 logback-spring.xml 詳細功能點,能夠配置哪些內容。

3.5.1 指定 logback-spring.xml 路徑

首先我們要知道 logback-spring.xml 文件放在哪里。

默認 logback-spring.xml 路徑在 resource 文件夾下,即你只要在 resource 文件夾下新建文件 logback-spring.xml 即可。

3.5.2 使用 logback-spring.xml 自定義配置

這里我們使用自定義配置 實現

  1. 把日志輸出到指定的目錄,並按照日期 yyyy-MM-dd 的格式按天存儲,注意如果沒有特別指定,這里的目錄 applog 就是指項目的根目錄(如果您的項目是多模塊配置並不是指模塊的目錄)
  2. 配置 xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
   <contextName>logback</contextName>
   <!--輸出到控制台-->
   <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
       <encoder>
           <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
           <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
           <charset>UTF-8</charset>
       </encoder>
   </appender>

   <!--按天生成日志-->
   <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <Prudent>true</Prudent>
       <!-- 過濾器,只打印ERROR級別的日志 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <!--日志文件輸出的文件名-->
           <FileNamePattern>
               applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
           </FileNamePattern>
           <!--日志文件保留天數-->
           <MaxHistory>15</MaxHistory>
       </rollingPolicy>
       <layout class="ch.qos.logback.classic.PatternLayout">
           <Pattern>
               %d{yyyy-MM-dd HH:mm:ss} -%msg%n
           </Pattern>
       </layout>
   </appender>

   <logger name="com.fishpro.log" additivity="false">
       <appender-ref ref="console"/>
       <appender-ref ref="logFile"/>
   </logger>
   
   <!-- 設置Spring&Hibernate日志輸出級別 -->
   <logger name="org.springframework" level="WARN"/>
   <logger name="org.mybatis" level="WARN"/> 
   <logger name="com.ibatis" level="DEBUG"/> 
   <logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG"/> 
   <logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG"/> 
   <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG"/>


      
   <logger name="java.sql.Connection" level="DEBUG"/>  
   <logger name="java.sql.Statement" level="DEBUG"/> 
   <logger name="java.sql.PreparedStatement" level="DEBUG"/> 
   <logger name="com.ruidou.baoqian.mapper" level="DEBUG"/>

   <!-- 開發環境下的日志配置 -->
   <root level="error">
       <appender-ref ref="console"/>
       <appender-ref ref="logFile"/>
   </root>
</configuration>

在瀏覽器中執行 http://locahost:8081/

此時,你會發現工程根目錄多出來 applog 文件夾,applog/2019-07-08/2019-07-08.log 按照日期分類來記錄文件,這很重要。

優先級

有趣的是,當我們把 xml 文件同 application.yml 都進行配置的時候,他執行了 logback-spring。xml 中的配置,所有 logback-spring.xml 配置是優先的

4 多日志組件如何統一框架

有的時候一個系統應用 Application 中使用了多個日志框架來處理,比如同時使用了 Logback、log4j如何統一呢?

總結:本章介紹了日志組件 Spring Boot Logback 的簡單使用,下一個章節,我們將詳細說明 logback-spring.xml 的標簽含義及標簽的屬性含義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM