我們編寫任何 Spring Boot 程序,可能繞不開的就是 log 日志框架(組件)。
在大多數程序員眼中日志是用來定位問題的。這很重要。
本項目源碼下載 注意本項目提供的源碼已在后期重新編寫,有部分日期描述不一致。
如果你只是想知道 Spring boot log 如何使用,請直接觀看 3.2 使用 Spring Boot Logback
1 Log 日志概述
1.1 Log 日志組件能干什么
日志能干的事情很多,對於學習程序,測試的工程師來說,日志能夠定位問題,解決問題,是最大的功能點。
- 記錄一切 日志幫助我們記錄程序功能都干了什么,無論是正常的輸入輸出還是出現異常,都可以用日志記錄
- 定位問題 日志可以幫助程序員調試問題,幫助測試人員定位問題
- 記錄分析用戶行為 統計分析師用來記錄用戶的一起行為,用於分析用戶的習慣和商業價值
- 備份和還原實時數據 數據庫工程師用來作為一種特殊的數據庫
1.2 日志的級別 Log Level
日志級別是對日志記錄信息的輕重緩急的划分。通常從輕到重划分為:
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
通常當我們指定日志級別為 INFO
級別,那么 TRACE
DEBUG
級別的日志就不會被輸出打印,同理如果指定日志級別為 ERROR
,那么其他類型的日志將不會被打印。
1.3 日志的輸出 Log Import
通常日志以文本流的形式存儲在磁盤,也可以把日志存儲在關系型數據庫中或 No Sql 中
- 文本
- 關系型數據庫
- No Sql
- Console 控制台
一般日志組件都可以自定義輸出格式。
1.4 Spring Boot 日志組件 Log Plugin
當然自己開發日志組件也是可以的,實際上也不是很難,在一些特殊場景,很多公司都是用自己開發的日志組件,但是對於大多數應用來說,我們使用標准的日志組件就可以解決我們的問題。
Spring Boot 日志組件最為常見的包括了
Logback
Spring Boot 約定的默認配置log4j
log4j2
slf4j
JUL
大部分場景我們都是推薦 Spring Boot 自帶的日志 logback
。
很多無良媒體直接抓取文章又不寫明來源,我是 fishpro程序魚,本文作者。
2 Spring Boot Logback
3.1 關於 Logback
在 Spring Boot 中,logback 是基於 slf4j 實現的。
slf4j的全稱是Simple Loging Facade For Java,即它僅僅是一個為Java程序提供日志輸出的統一接口,並不是一個具體的日志實現方案,他能夠實現大部分 日志組件。
如上圖所示,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 不同環境中配置
我們可以在 dev
、prod
、test
等環境中配置不同的 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 自定義配置
這里我們使用自定義配置 實現
- 把日志輸出到指定的目錄,並按照日期 yyyy-MM-dd 的格式按天存儲,注意如果沒有特別指定,這里的目錄 applog 就是指項目的根目錄(如果您的項目是多模塊配置並不是指模塊的目錄)
- 配置 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 的標簽含義及標簽的屬性含義。