最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot日志信息以及Lombok的常用注解詳析

 更新時(shí)間:2023年12月04日 08:24:40   作者:韻秋梧桐  
日志在我們的日常開(kāi)發(fā)當(dāng)中是必定會(huì)用到的,這篇文章主要給大家介紹了關(guān)于SpringBoot日志信息以及Lombok的常用注解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一. 日志的介紹

1. 什么是日志

日志是我們程序重要組成部分,它是程序在運(yùn)行過(guò)程當(dāng)中輸出的一些提示或異常信息,我們可以通過(guò)日志來(lái)觀(guān)察程序執(zhí)行的情況,如果程序出現(xiàn) Bug,我們可以根據(jù)日志去發(fā)現(xiàn)和排查程序的 Bug。

SpringBoot 項(xiàng)目在啟動(dòng)的時(shí)候,就會(huì)有默認(rèn)的日志輸出,如下圖所示:

之所以會(huì)有上面的輸出,是因?yàn)?SpringBoot 中內(nèi)置了日志框架。

SpringBoot 中內(nèi)置了 SLF4J 和 logback 兩個(gè)日志框架,用戶(hù)層面并不是直接操作具體的日志對(duì)象,而是使用 SLF4J 提供給用戶(hù)的 API 進(jìn)而由 logback 操作具體的日志對(duì)象實(shí)現(xiàn)日志。

img

img

SLF4J 這類(lèi)框架是使用“門(mén)面模式”來(lái)實(shí)現(xiàn)的,SLF4J 其實(shí)和 JDBC 很像,我們知道使用 JDBC 操作數(shù)據(jù)庫(kù),一套 JDBC 代碼就可以操作很多種數(shù)據(jù)庫(kù),可以是 MySQL,Oracle,DB2,SqlServer等,而這個(gè)JDBC 就相當(dāng)于代理一樣,來(lái)代理去操作數(shù)據(jù)庫(kù),我們不必關(guān)心各種數(shù)據(jù)庫(kù)的實(shí)現(xiàn),只需關(guān)注 JDBC 提供給我們的的 API 即可。

類(lèi)似的,SLF4J 中也并不是真正完成了日志實(shí)現(xiàn)的框架,它只是一個(gè)門(mén)面或者一個(gè)代理,我們調(diào)用 SLF4J 的 API,SLF4J 中還會(huì)去調(diào)用 logback 這樣的日志實(shí)現(xiàn)框架,此時(shí)我們就不必關(guān)心日志實(shí)現(xiàn)的細(xì)節(jié),這一層面我們是感知不到的,這就是門(mén)面模式所帶來(lái)的好處,還有一個(gè)好處就是如果日志實(shí)現(xiàn)層出現(xiàn)了漏洞,只需要修改更換日志實(shí)現(xiàn)的框架即可,而 SLF4J 可以匹配相應(yīng)的日志框架,此時(shí)雖然日志實(shí)現(xiàn)的框架發(fā)生了改變,但我們寫(xiě)的代碼仍然不受影響,這樣就使得系統(tǒng)的依賴(lài)性降低,利于系統(tǒng)更新和維護(hù)。

img

2. 日志的作用

  • 能夠幫助程序猿排除程序的 Bug。
  • 記錄用戶(hù)登錄日志,方便分析用戶(hù)是正常登錄還是惡意破解用戶(hù)。
  • 記錄系統(tǒng)的操作日志,方便數(shù)據(jù)恢復(fù)和定位操作人。
  • 記錄程序的執(zhí)行時(shí)間,方便為以后優(yōu)化程序提供數(shù)據(jù)支持。

二. 日志的使用

使用日志框架可以配置日志的級(jí)別來(lái)控制日志的輸出,而我們?nèi)粘J褂?code>System.out.printf來(lái)輸出日志是無(wú)法做到這一點(diǎn)的。

1. 日志格式說(shuō)明

對(duì)于控制臺(tái)輸出的日志,它的各部分含義如下:

img

信息中的包名有部分是簡(jiǎn)寫(xiě),取的是包名的第一個(gè)字母;
根據(jù)這些信息,我們就可以知道日志是發(fā)生在什么時(shí)間,在哪個(gè)線(xiàn)程,哪個(gè)類(lèi),以及具體的日志信息。

2. 自定義日志的輸出

1??第一步,在類(lèi)中先獲取到日志對(duì)象,這個(gè)日志對(duì)象來(lái)自于日志框架SLF4J。

假設(shè)我們?cè)陬?lèi)LogController設(shè)置自定義日志的輸出,則日志對(duì)象創(chuàng)建代碼如下:

每一個(gè)類(lèi)都對(duì)應(yīng)一個(gè)日志對(duì)象,可以通過(guò)日志工廠(chǎng)LoggerFactory獲取的,導(dǎo)包的時(shí)候要注意Logger對(duì)象是在org.slf4j包下的,不要導(dǎo)錯(cuò)。

// 獲取日志對(duì)象
private static Logger log =
        LoggerFactory.getLogger(LogController.class);

getLogger()一般傳入傳入當(dāng)前類(lèi)的類(lèi)型,這里的參數(shù)用來(lái)定位日志的歸屬類(lèi),以方便日志輸出,輸出的日志信息中有了日志的定位, 才能更方便、更直觀(guān)的定位到問(wèn)題類(lèi)。

2??第二步,使用日志對(duì)象提供的方法來(lái)實(shí)現(xiàn)自定義日志的打印。

日志對(duì)象提供的方法有很多,可以設(shè)定不同級(jí)別的日志信息輸出。

img

??示例代碼:

@RestController相當(dāng)于是將@Controller@ResponseBody這兩個(gè)注解合起來(lái)的效果。

package com.example.springboot2.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogController {
    // 獲取日志對(duì)象
    private static Logger log =
            LoggerFactory.getLogger(LogController.class);
    
    @RequestMapping("/log")
    public void log() {
        log.trace("我是trace");
        log.debug("我是debug");
        log.info(("我是info"));
        log.warn("我是warn");
        log.error("我是error");
    }
}

我們啟動(dòng)程序后,訪(fǎng)問(wèn)http://127.0.0.1:8080/log后,控制臺(tái)就有相應(yīng)的日志輸出了。

img

觀(guān)察輸出結(jié)果,我們的代碼是寫(xiě)了 5 個(gè)級(jí)別的日志輸出的,為什么這里結(jié)果只有 3 個(gè)結(jié)果呢?這是因?yàn)镾pringBoot 項(xiàng)目下,默認(rèn)日志級(jí)別為info,低于info日志級(jí)別的都不會(huì)輸出。

3. 日志級(jí)別

??日志級(jí)別分為一下幾種:

  • trace:微量,少許的意思,級(jí)別最低。
  • debug:需要調(diào)試時(shí)候的關(guān)鍵信息打印。
  • info:普通的打印信息(默認(rèn)日志級(jí)別)。
  • warn:警告,不影響使用,但需要注意的問(wèn)題。
  • error:錯(cuò)誤信息,級(jí)別較高的錯(cuò)誤日志信息。
  • fatal:致命的,因?yàn)榇a異常導(dǎo)致程序退出執(zhí)行的事件,不支持用戶(hù)自定義。

img

SpringBoot 項(xiàng)目默認(rèn)的日志級(jí)別是info,那么比info日志級(jí)別低的是不能輸出的,也就是debugtrace的日志是不會(huì)輸出的,只有大于等于info級(jí)別的日志才會(huì)輸出。

??日志級(jí)別的作用:

  • 日志級(jí)別可以幫我們篩選出重要的信息,比如設(shè)置日志級(jí)別為 error,那么就可以只看程序的報(bào)錯(cuò)日志了,對(duì)于普通的調(diào)試日志和業(yè)務(wù)日志就可以忽略了,從而節(jié)省開(kāi)發(fā)者信息篩選的時(shí)間。
  • 日志級(jí)別可以控制不同環(huán)境下,?個(gè)程序是否需要打印日志,如開(kāi)發(fā)環(huán)境我們就需要很詳細(xì)的日志信息, 而生產(chǎn)環(huán)境為了保證性能和安全性就會(huì)輸?盡量少的?志,通過(guò)日志的級(jí)別就可以實(shí)現(xiàn)此需求。

簡(jiǎn)單來(lái)說(shuō),就是過(guò)濾信息,將業(yè)務(wù)不需要的日志屏蔽掉。

4. 日志級(jí)別的配置

日志級(jí)別是可以通過(guò)配置文件進(jìn)行設(shè)置的,日志級(jí)別包括兩類(lèi),一類(lèi)是全局日志級(jí)別,另一類(lèi)就是局部日志級(jí)別,全局日志級(jí)別可以影響全局日志的輸出,而局部日志級(jí)別只會(huì)影響一個(gè)局部的日志輸出,并且局部日志級(jí)別配置大于全局日志級(jí)別的配置。

??全局日志級(jí)別配置,如修改默認(rèn)日志級(jí)別為trace

properties 日志格式:

# 設(shè)置全局日志級(jí)別
logging.level.root=trace

yml 日志格式:

logging:
	level:
		root: trace

運(yùn)行上面我們的自定義日志代碼,此時(shí)就會(huì)發(fā)現(xiàn),我們所有的自定義日志信息都會(huì)輸出,并且隨著程序啟動(dòng)相比較默認(rèn)情況下會(huì)有更多的日志信息輸出,畢竟這里設(shè)置的是全局的配置文件,會(huì)影響全局。

img

??下面來(lái)介紹局部日志級(jí)別的配置,我們將LogController類(lèi)的日志級(jí)別設(shè)置為warn,此時(shí)只會(huì)LogController類(lèi)中日志輸出級(jí)別,并不會(huì)影響其他位置的日志信息輸出。

properties 格式配置文件:

# 設(shè)置夾局部的日志級(jí)別 (包名/包名+類(lèi)名)
logging.level.com.example.demo.controller.LogController=warn

yml 格式配置文件:

logging:
	level:
		com:
			example:
				demo:
					controller: 
                    	LogController :warn

控制臺(tái)結(jié)果:

img

yml 格式配置文件可以一步設(shè)置全局和局部的日志級(jí)別,比如:

logging:
  level:
    root: info
    com:
      example:
        springboot2:
          controller: error
          service: warn

root設(shè)置的是全局日志級(jí)別,項(xiàng)目中所有日志級(jí)別都是info;和root同級(jí)下可設(shè)置局部具體類(lèi)的日志級(jí)別m這里就是com.example.springboot2.controllercom.example.springboot2.service包下的類(lèi),級(jí)別分別為errorwarn。

5. 日志持久化

前面的介紹都是將日志輸出在控制臺(tái)上的,然而我們?cè)谏a(chǎn)環(huán)境下往往需要將日志保存下來(lái),以便于后續(xù)出現(xiàn)問(wèn)題時(shí)去追溯原因,將日志保存下來(lái)的過(guò)程就稱(chēng)之為持久化。

實(shí)現(xiàn)日志持久化的方式就是將日志信息保存到磁盤(pán),同樣可以通過(guò)設(shè)置配置文件實(shí)現(xiàn)。

??方式1:設(shè)置日志保存路徑

properties 格式配置文件:

logging.file.path=D:\\bit\\logs

yml 格式配置文件:

logging:
  file:
    path: D:\\bit\\logs

啟動(dòng)程序,此時(shí) SpringBoot 就會(huì)將控制臺(tái)中打印的日志寫(xiě)到對(duì)應(yīng)的目錄了,日志文件默認(rèn)名的為spring.log。

img

img

??方式2:設(shè)置日志保存文件

properties 格式配置文件:

logging.file.name=D:\\bit\\log\\logging.log

yml 格式配置文件:

logging:
  file:
    name: D:\\bit\\log\\logging.log

效果如下:

img

img

還要注意,多次訪(fǎng)問(wèn)程序產(chǎn)生的日志是以追加的形式保存到日志文件當(dāng)中的,SpringBoot 默認(rèn)保存日志文件的大小為10MB**,**超出范圍就會(huì)自動(dòng)創(chuàng)建新的日志文件,然后保存到新的日志文件當(dāng)中。

當(dāng)然,也可以通過(guò)配置文件自定義日志文件的大小,配置方式如下:

# properties格式
logging.logback.rollingpolicy.max-file-size=10MB

# yml格式
logging:
	logback:
    	rollingpolicy:
    		max-file-size: 10MB

6. 更簡(jiǎn)單的輸出日志-Lomok

每次都使? LoggerFactory.getLogger(xxx.class) 很繁瑣,且每個(gè)類(lèi)都添加?遍,也很麻煩,在 Lombok 中有一個(gè)@Slf4j注解,可以使用該注解更簡(jiǎn)單的輸出日志。

準(zhǔn)備工作,首先要確保你的 IDEA 中有 Lombok 這個(gè)插件,沒(méi)有的話(huà)去下載一下。

img

然后,添加 Lombok 依賴(lài),可以使用 Edit Starters 插件快捷添加。

img

刷新一下,依賴(lài)就添加好了。

img

??使用方法:在想打印日志的類(lèi)上加上 @Slf4j 注解即可,它會(huì)為當(dāng)前類(lèi)提供一個(gè) log 對(duì)象。

要注意使用 @Slf4j 注解,在程序中使用 log 對(duì)象即可輸??志,并且只能使? log 對(duì)象才能輸出,這是 lombok 提供的對(duì)象名;代碼中輸入 log 后就會(huì)有相關(guān)方法的提醒(前提是安裝了 lombok 插件)。

package com.example.springboot2.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j  // 當(dāng)前的類(lèi)中就可以直接使用 log 對(duì)象, @Slf4j 產(chǎn)生一個(gè) log 對(duì)象, 直接使用即可
public class LogController2 {
    @RequestMapping("/log2")
    public void log2(){
        log.trace("我是trace");
        log.debug("我是debug");
        log.info(("我是info"));
        log.warn("我是warn");
        log.error("我是error");
    }

}

啟動(dòng)程序,訪(fǎng)問(wèn)路路徑http://127.0.0.1:8080/log2,同樣可以輸出日志,代碼更簡(jiǎn)單。

img

@Slf4j 注解替代了日志對(duì)象獲取的代碼:

private  final static Logger log = LoggerFactory.getLogger(LogController2.class);

7. Lombok框架實(shí)現(xiàn)原理以及其他常見(jiàn)注解

Lombok 框架其實(shí)在編譯的時(shí)候,將依據(jù)注解去替生成對(duì)應(yīng)的代碼,比如就像上面的日志對(duì)象創(chuàng)建,加上一個(gè) @Slf4j 注解后,在編譯時(shí)就會(huì)將類(lèi)似與上面創(chuàng)建日志對(duì)象的代碼生成到我們所寫(xiě)代碼里面去,包括Lombok 其他的注解,如生成 Setter 的注解 @Setter,生成 Getter 的注解 @Getter 等都是通過(guò)編譯時(shí)期間實(shí)現(xiàn)的。

img

??Lombok作用:

img

比如上面我們寫(xiě)的代碼最終生成相應(yīng)的字節(jié)碼文件就在 target 目錄中,target 目錄中的代碼才是項(xiàng)目最終執(zhí)行的代碼,查看 target 目錄如下:

img

我們來(lái)對(duì)比一下我們LogController2.java原文件代碼和程序運(yùn)行起來(lái)后生成LogController2.class文件中的代碼(由 IDEA 反編譯顯示)。

發(fā)現(xiàn)代碼中的 @Slf4j 注解就不存存在了,被 log 對(duì)象替代了,所以,Lombok 是不會(huì)影響程序運(yùn)行的信能的,它要完成的工作都是在編譯生成字節(jié)碼文件前完成的。

??其他常用注解:

基本注解:

注解作用
@Setter?動(dòng)添加 setter 方法
@Getter?動(dòng)添加 getter 方法
@ToString?動(dòng)添加 toString 方法
@EqualsAndHashCode?動(dòng)添加 equals 和 hashCode 方法
@NoArgsConstructor?動(dòng)添加?參構(gòu)造方法
@AllArgsConstructor?動(dòng)添加全屬性構(gòu)造?法,順序按照屬性的定義順序
@NonNull屬性不能為 null
@RequireArgsConstructor?動(dòng)添加必需屬性的構(gòu)造方法,final + @NonNull 的 屬性為必需

組合注解:

注解作用
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor

日志注解:

注解作用
@Slf4j添加?個(gè)名為 log 的日志,使用 slf4j

使用 Lombok 提供給我們的這些注釋?zhuān)梢院芎玫膸椭覀兿?xiàng)目中大量冗余的代碼,可以使得我們的 Java 類(lèi)可以看起來(lái)非常的干凈整潔。

總結(jié)

到此這篇關(guān)于SpringBoot日志信息以及Lombok的常用注解的文章就介紹到這了,更多相關(guān)SpringBoot日志信息Lombok注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

美姑县| 三门县| 鹤山市| 民县| 吉木乃县| 云梦县| 九龙县| 手机| 区。| 韩城市| 莱州市| 梧州市| 清远市| 马尔康县| 信阳市| 九江县| 龙泉市| 尚志市| 黑山县| 綦江县| 肥城市| 冀州市| 墨玉县| 岳阳市| 喀什市| 孝义市| 枣阳市| 普兰县| 五台县| 昌邑市| 莱州市| 仙桃市| 黄梅县| 安徽省| 阜宁县| 海阳市| 广德县| 连州市| 泸溪县| 霍山县| 房山区|