網站首頁 編程語言 正文
文章目錄
- ??前言
- 1.日志長什么樣子?
- 2.自定義打印日志
- 2.1 在程序中得到日志對象
- 2.2 使用日志對象打印日志
- 3.日志級別
- 3.1 日志級別的分類與使用
- 3.2 日志級別有什么用呢?
- 3.3 日志級別的設置
- 4.日志持久化保存
- 5.更方便的日志輸出
- 5.1 添加 lombok 框架
- 5.2 使用注釋輸出日志
- ??總結

??前言
日志、日志,日志就是記錄發生了什么。為啥要記錄發生了什么呢?想象?下,如果程序報錯了,不讓你打開控制臺看?志,那么你能找到報錯的原因嗎?因此我們需要記錄程序的行為,通過這些行為能讓我們更好的發現和定位錯誤所在位置。
除了發現和定位問題之外,還可以通過?志實現以下功能:
- 記錄?戶登錄?志,?便分析?戶是正常登錄還是惡意破解?戶。
- 記錄系統的操作?志,?便數據恢復和定位操作?。
- 記錄程序的執?時間,?便為以后優化程序提供數據?持。
可以看出來日志在程序中扮演這非常重要的角色了。
1.日志長什么樣子?
SpringBoot 項目啟動的時候默認就會有日志輸出,如下圖:
通過上述日志信息提出三個疑問:
- Spring Boot 如何打印日志?(提前把這個說了:它內置了日志框架,因此可以打印日志)
- 默認情況下,輸出的日志并非是開發者定義和打印的,開發者怎么在程序中?定義打印?志呢?
- 日志默認打印在控制臺上,而控制臺的日志不能保存,如何將日志永久保存呢?
接下來讓我們尋找找答案
2.自定義打印日志
自定義打印日志分為兩步走:
- 在程序中得到日志對象
- 使用日志對象的相關語法輸出打印內容
2.1 在程序中得到日志對象
//1.得到日志對象
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
在導包時,我們使用的時slf4j包
下面的 Logger
,這里不要導包導錯了。
因為 SpringBoot 中內置了日志框架slf4j
,所以我們可以直接在程序中調用slf4
來輸出日志。
2.2 使用日志對象打印日志
// 2.使??志打印?志
logger.info("--------------要輸出?志的內容----------------");
日志打印結果:
這日志打印出來看起來像是一串字符串,我們如何去看出來日志打印的是什么東西呢?看下圖的介紹:
日志之間有很多等級劃分,我們通常把他分為六個等級。
3.日志級別
3.1 日志級別的分類與使用
日志級別一覽表(由上到下等級遞增):
等級 | 解釋 |
---|---|
trace | 微量,少許的意思,級別最低的日志 |
debug | 需要調試時候的打印關鍵信息 |
info | 普通打印信息,也是默認日志級別 |
warn | 警告,這個級別的日志不影響使用,但需要注意問題 |
error | 錯誤信息,級別較高的錯誤日志信息 |
fatal | 致命的,因為代碼異常導致程序退出執行的事件 |
3.2 日志級別有什么用呢?
- 日志級別可以幫你篩選出重要的信息,?如設置?志級別為 error,那么就可以只看程序的報錯?志了,對于普通的調試?志和業務?志就可以忽略了,從而節省開發者信息篩選的時間。
- 日志級別可以控制,不同環境下打印日志的要求可以設置(一般分為開發環境和生產環境),?個程序是否需要打印?志,如開發環境我們需要很詳細的信息,??產環境為了保證性能和安全性就會輸出盡量少的日志。
第一條也許比較難理解,我們寫代碼演示一下,我們知道日志等級默認的是info
級別的,我們打印如下日志:
@Controller
@ResponseBody
public class TestController {
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/sayHi")
public String sayHi(String name) {
logger.trace("----------- 我是 trace 級別的日志 -----------");
logger.debug("----------- 我是 debug 級別的日志 -----------");
logger.info("----------- 我是 info 級別的日志 -----------");
logger.warn("----------- 我是 warn 級別的日志 -----------");
logger.error("----------- 我是 error 級別的日志 -----------");
if(!StringUtils.hasLength(name)) {
name ="張三";
}
String res = "你好" + name;
return res;
}
觀察控制臺:
你會新奇的發現,比info
級別小的日志,沒有出現在控制臺,也就是沒有打印,這就是第一條說的, 日志級別可以幫你篩選出重要的信息。
3.3 日志級別的設置
這個日志級別怎么有用,我們應該如何設置日志級別呢?答案是在配置文件(yaml文件或者properties文件)中設置,我們這里使用yaml文件。
打印大于error級別的日志,如下圖,:
logging:
level:
root: error
設置完等級,我們再次啟動項目,看看是否符合我們的預期,看下圖,它符合我們的預期,只打印了 error級別的日志。
4.日志持久化保存
上方舉得例子都是打印在控制臺上的,然而在生產環境上需要將日志持久化保存下來,以便追溯問題位置。
想要將日志進行持久化保存,只需要在配置文件中指定日志的存儲目錄或者指定日志保存文件名之后,SpringBoot 就會將控制臺的日志寫到我們配置的目錄或文件中去。
配置文件的保存路徑:
# 設置日志文件的目錄
logging:
file:
path: F:\\info\\
我們再次啟動項目,打開設置好的路徑,看看是否有日志保存:
打開后可以看到有日志保存,證明我們的設置是正確的。
5.更方便的日志輸出
每次打印日志,我們都是使用 LoggerFactory.getLogger(×××.class)這樣的操作,代碼顯得冗余,我們可以使用更簡單好用的日志輸出方法,使用 lombok 來更簡單的輸出。
其步驟大概分為兩步:
- 添加 lombok 框架支持
- 使用
@Slf4j
注解輸出日志
5.1 添加 lombok 框架
這個框架提供了非常多的簡便注解,可以減少代碼冗余,如果有需要可以去了解一下!
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
5.2 使用注釋輸出日志
我們在類上方添加@Slf4j
注釋,在使用時我們就會得到一個對象log對象。代碼如下:
@Controller
@ResponseBody
@Slf4j
public class TestController {
@RequestMapping("/sayHi")
public String sayHi(String name) {
log.trace("----------- 我是 trace 級別的日志 -----------");
log.debug("----------- 我是 debug 級別的日志 -----------");
log.info("----------- 我是 info 級別的日志 -----------");
log.warn("----------- 我是 warn 級別的日志 -----------");
log.error("----------- 我是 error 級別的日志 -----------");
if(!StringUtils.hasLength(name)) {
name ="張三";
}
String res = "你好" + name;
return res;
}
}
??總結
- 日志時程序中的重要組成部分,使用日志可以快速的發現和定位問題。
- 在配置文件中設置日志時,設置的等級越高,收到的日志信息也就越少。
- SpringBoot 內置了日志框架,默認情況下使用的是 info 日志級別打印在控制臺上,我們可以通過配置文件將日志持久化。
- 在手搓日志中,代碼有冗余,我們可以使用 lombok 提供的
@Slf4j
注解和 log對象 快速的打印自定義日志。
原文鏈接:https://blog.csdn.net/qq_65228171/article/details/131486824
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-09-05 C語言之數組名與數組起始地址的關系解析_C 語言
- 2022-10-13 Windows命令批處理的用法詳解_DOS/BAT
- 2022-08-26 Redis哨兵模式實現一主二從三哨兵_Redis
- 2023-05-21 Golang?flag包的具體使用_Golang
- 2022-06-14 Github?Copilot結合python的使用方法詳解_python
- 2022-05-06 Windows如何關閉被占用的端口
- 2022-04-19 C語言位段(位域)機制結構體的特殊實現及解析_C 語言
- 2022-09-28 SQLServer常見數學函數梳理總結_MsSql
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支