JavaEE之SpringBoot日志使用及說明
1. 日志的介紹
日志就是程序在運(yùn)行過程中記錄下來程序所做的工作。
2. 日志的作用
系統(tǒng)監(jiān)控,我們可以通過日志來記錄系統(tǒng)的工作狀況,及時發(fā)現(xiàn)問題。
數(shù)據(jù)采集,通過日志獲取到用戶請求的數(shù)據(jù),對數(shù)據(jù)進(jìn)行分析,進(jìn)而推測出用戶的特點(diǎn)。
日志審計,可以通過日志來判斷一些網(wǎng)絡(luò)安全問題。
3. 日志的使用
3.1 認(rèn)識日志
我們在啟動Spring Boot項目時候,就會發(fā)現(xiàn)控制臺打印了很多日志,我們就分析下這些日志的結(jié)構(gòu):

如果我們在該項目的配置文件中,沒有寫下面的配置信息,此時打印的日志里面就不會顯示項目名稱:
spring:
application:
name: spring-captcha-demo3.2 使用日志
我們創(chuàng)建一個類來打印日志:
Spring Boot給我們提供了一個打印日志的框架,我們直接使用就行,使用LoggerFactory類里面的getLogger方法,參數(shù)是類對象,來打印出來的日志就會顯示是哪個類打印的日志,然后調(diào)用日志對象的info方法,輸入日志內(nèi)容,就會打印出來日志。
package com.sias.log.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/log")
@RestController
public class LogController {
//生成一個日志對象
private Logger logger = LoggerFactory.getLogger(LogController.class);
@RequestMapping("/print")
public String print() {
//普通輸出打印日志
System.out.println("打印日志");
//使用info方法打印日志
logger.info("打印日志");
return "打印日志";
}
}
打印結(jié)果:

使用info方法打印出來的日志,格式就是Spring Boot自帶的格式。
3.3 日志框架介紹
- 日志門面: SLF4J
- 日志實現(xiàn):log4J JUL logback
這里的日志門面相當(dāng)于是一種規(guī)范,不具體實現(xiàn)操作,而是直接調(diào)用日志實現(xiàn)的框架,具體的操作實現(xiàn)由下面三個框架去實現(xiàn)。
門面模式介紹
上面的這種設(shè)計模式就是門面模式,提供一個統(tǒng)一的接口去使用,這個接口再去調(diào)用其他子接口,更方便的去調(diào)用子接口。
比如我們想要關(guān)家里的燈,但是需要關(guān)很多開關(guān)但是此時我們可以設(shè)置一個總開關(guān),來控制所有的燈,直接關(guān)閉這個總開關(guān)就可以關(guān)閉所有的燈。
代碼簡單實現(xiàn):
控制所有子接口的類:
package com.sias.log.facade;
public class FacadeClient {
private BedRoomLight bedRoomLight = new BedRoomLight();
private LivingRoomLight livingRoomLight = new LivingRoomLight();
private HallLight hallLight = new HallLight();
//開燈
void on() {
bedRoomLight.on();
livingRoomLight.on();
hallLight.on();
}
//關(guān)燈
void off() {
bedRoomLight.off();
livingRoomLight.off();
hallLight.off();
}
}子接口類:
public class BedRoomLight implements Light {
@Override
public void on() {
System.out.println("打開臥室燈");
}
@Override
public void off() {
System.out.println("關(guān)閉臥室燈");
}
}public class LivingRoomLight implements Light {
@Override
public void on() {
System.out.println("打開客廳燈");
}
@Override
public void off() {
System.out.println("關(guān)閉客廳燈");
}
}public class HallLight implements Light {
@Override
public void on() {
System.out.println("打開走廊燈");
}
@Override
public void off() {
System.out.println("關(guān)閉走廊燈");
}
}我們就可以在main方法調(diào)用這個總接口:
public class Main {
public static void main(String[] args) {
FacadeClient facadeClient = new FacadeClient();
facadeClient.on();
facadeClient.off();
}
}而在Spring Boot中使用的是SLF4J+logback框架,來進(jìn)行打印日志的。
3.4 日志級別
日志的級別由高到低分為:
FATAL:致命錯誤,表示必須立即處理的錯誤。ERROR:錯誤信息,級別較高的錯誤信息,不影響程序正常運(yùn)行。WARN:警告信息,不影響使用,需要注意的問題。INFO:普通信息,用于記錄程序正常運(yùn)行時的信息,比如:系統(tǒng)啟動完成,請求處理完成等。DEBUG:調(diào)試信息,需要調(diào)試時候的關(guān)鍵信息打印。TRACE:追蹤信息,一般不使用。
Spring Boot默認(rèn)的打印日志的級別是INFO級別。
我們可以調(diào)用對應(yīng)的方法來打印不同級別的日志:
package com.sias.log.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/log")
@RestController
public class LogController {
//生成一個日志對象
private Logger logger = LoggerFactory.getLogger(LogController.class);
@RequestMapping("/print")
public String print() {
//普通輸出打印日志
System.out.println("打印日志");
//使用info方法打印日志
logger.info("打印日志");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("gebug");
logger.trace("trace");
return "打印日志";
}
}
輸出結(jié)果:

這里fatal級別日志就沒有對應(yīng)的方法,如果真發(fā)生嚴(yán)重錯誤就不需要靠日志來進(jìn)行提醒了。
這里控制臺只打印到info,因為默認(rèn)是info及以上的日志才會打印。
3.5 日志配置
配置日志級別
我們可以在配置文件里面修改日志的級別:

我們還可以設(shè)置某個具體的包下面的代碼的打印日志的級別:
這里就是在具體某個包下打印的日志是debug級別的。
logging:
level:
root: info
com:
sias:
log:
controller: debug日志的持久化
我們可以把打印的日志保存下來,通過設(shè)置配置文件將日志保存在文件里面:
logging:
file:
name: log.log打印結(jié)果存儲在log.log文件里面:

這里name還可以設(shè)置目錄:
logging:
file:
name: dee/log.log
還有一個path屬性設(shè)置路徑:
logging:
file:
path: pa/log
使用這個屬性只能設(shè)置路徑,文件名字是固定的spring.log
如果path和name兩個屬性同時存在,此時就會使用name屬性設(shè)置的值。
日志的分割
我們在存儲日志時候,默認(rèn)情況下當(dāng)一個文件大小超過10MB,此時就會分割,存儲到一個新的文件里面,我們也可以設(shè)置這個分頁的閾值:
logging:
level:
root: debug
file:
name: ff/log.log
logback:
rollingpolicy:
max-file-size: 1KB
默認(rèn)分開后的文件是個壓縮文件,我們也可以通過配置去修改分開后的文件名和類型:
logging:
level:
root: debug
file:
name: ff/log.log
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
日志格式的修改
我們可以修改控制臺的日志格式和日志文件中的日志格式:

- %clr(表達(dá)式){yanse} 設(shè)置輸入日志的顏色。
- %d{${時間格式}} 日期和時間--精確到毫秒。
- %5p 顯示日志級別
- %t 線程名 %c 類的全限定名 %M method
- %L 行號 %thread 線程名稱 %m/%msg 顯示輸出消息 %n換行符
- %5 如果字符串長度小于5,右邊用空格填充,%-5字符串長度小于5,左邊用空格填充。
- %.15字符串長度大于15,截取多余字符。
- %15.15字符串長度小于15,右邊用空格填充,字符串長度大于15,截取多余字符。
我們可以看到默認(rèn)日志設(shè)置了顏色,但是控制臺顯示的都是黑色,這里需要修改設(shè)置:
按照下面步驟操作:



最后點(diǎn)擊OK,就好了。
我們就可以使用上面的兩個屬性來修改格式:
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'此時打印的日志格式如下:

3.6 使用注解@Slf4j注解
我們在使用@Slf4j注解時候,需要添加下面的依賴:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
我們通過上面發(fā)現(xiàn),我們打印日志時候,需要先創(chuàng)建一個打印日志的對象,還要填入類對象的參數(shù),這個過程就可以使用@Slf4j注解來解決。
原來的代碼:
@RequestMapping("/log")
@RestController
public class LogController {
//生成一個日志對象
private Logger logger = LoggerFactory.getLogger(LogController.class);
@RequestMapping("/print")
public String print() {
//普通輸出打印日志
System.out.println("打印日志");
//使用info方法打印日志
logger.info("打印日志");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("gebug");
logger.trace("trace");
return "打印日志";
}
}
修改后的代碼:
此時使用@Slf4j注解就會生成一個log的注解對象,對應(yīng)上面的logger對象,可以打印日志。
@Slf4j
@RequestMapping("/log2")
@RestController
public class LogController2 {
@RequestMapping("/print")
public String print() {
log.error("error");
log.warn("warn");
log.info("info");
log.debug("gebug");
log.trace("trace");
return "打印日志";
}
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring+srpingmvc+hibernate實現(xiàn)動態(tài)ztree生成樹狀圖效果
這篇文章主要介紹了spring+srpingmvc+hibernate動態(tài)ztree生成樹狀圖效果,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
SpringBoot+Vue+Redis實現(xiàn)單點(diǎn)登錄(一處登錄另一處退出登錄)
小編接到一個需求,需要實現(xiàn)用戶在瀏覽器登錄后,跳轉(zhuǎn)到其他頁面,當(dāng)用戶在其它地方又登錄時,前面用戶登錄的頁面退出登錄,這篇文章主要介紹了SpringBoot+Vue+Redis實現(xiàn)單點(diǎn)登錄,需要的朋友可以參考下2019-12-12
springMVC利用FastJson接口返回json數(shù)據(jù)相關(guān)配置詳解
本篇文章主要介紹了springMVC利用FastJson接口返回json數(shù)據(jù)相關(guān)配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
單點(diǎn)登錄的概念及SpringBoot實現(xiàn)單點(diǎn)登錄的操作方法
在本文中,我們將使用Spring Boot構(gòu)建一個基本的單點(diǎn)登錄系統(tǒng),我們將介紹如何使用Spring Security和JSON Web Tokens(JWTs)來實現(xiàn)單點(diǎn)登錄功能,本文假設(shè)您已經(jīng)熟悉Spring Boot和Spring Security,感興趣的朋友一起看看吧2024-10-10
SpringBoot中使用@ControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中使用@ControllerAdvice注解詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個Controller增強(qiáng)器,可對controller中被 @RequestMapping注解的方法加一些邏輯處理,需要的朋友可以參考下2023-10-10

