一. 關(guān)于 Spring Boot 日志的使用
Spring Boot 日志機(jī)制和工具用于記錄應(yīng)用程序的日志信息和追蹤應(yīng)用程序的執(zhí)行過(guò)程。它集成了常用的日志框架,如 Log4j、logback、Java Util Logging等,并提供簡(jiǎn)單易用的配置方式,讓開發(fā)人員可以方便地監(jiān)控應(yīng)用程序的運(yùn)行狀態(tài)和性能。在項(xiàng)目啟動(dòng)時(shí),日志已經(jīng)開始輸出,但尚未持久化。下面是一個(gè)最簡(jiǎn)單、最常見的日志示例。
二. 日志的作用
日志是記錄應(yīng)用程序運(yùn)行狀態(tài)和運(yùn)行過(guò)程中所發(fā)生的事件的一種技術(shù)手段。它能夠幫助開發(fā)人員更容易地追蹤和排查問(wèn)題,同時(shí)還可以提高應(yīng)用程序的安全性、穩(wěn)定性和可靠性。
在軟件開發(fā)過(guò)程中,日志可以:
1.調(diào)試程序:當(dāng)程序出現(xiàn)問(wèn)題時(shí),可以查看日志文件以分析問(wèn)題的原因,從而進(jìn)行適當(dāng)?shù)男迯?fù)。
2.跟蹤操作:在應(yīng)用程序中記錄用戶操作,以便進(jìn)行回顧和審計(jì),保證系統(tǒng)安全。
3.監(jiān)控性能:對(duì)于服務(wù)器端應(yīng)用程序,可以記錄響應(yīng)時(shí)間、CPU、內(nèi)存和硬盤使用情況等指標(biāo),以便及時(shí)發(fā)現(xiàn)并解決性能問(wèn)題。
4.系統(tǒng)運(yùn)行情況:記錄應(yīng)用程序在不同環(huán)境下的運(yùn)行狀態(tài)、故障等,以便于開發(fā)人員和管理員及時(shí)了解系統(tǒng)運(yùn)行情況,保證系統(tǒng)的穩(wěn)定性和可靠性。
5.統(tǒng)計(jì)數(shù)據(jù):將日志文件作為數(shù)據(jù)來(lái)源,進(jìn)行統(tǒng)計(jì)分析,以便了解用戶行為、訪問(wèn)量等信息,從而進(jìn)行決策和規(guī)劃。
總而言之,日志是一種非常重要的技術(shù)手段,它能夠幫助開發(fā)人員更好地維護(hù)應(yīng)用程序、改進(jìn)用戶體驗(yàn)和提高應(yīng)用程序的穩(wěn)定性和可靠性。從上面的 Spring Boot 項(xiàng)目啟動(dòng)日志可以看出,啟動(dòng)過(guò)程中打印了一些信息,其中包括 BUG 等級(jí)和端口號(hào)等。然而,這些僅僅是啟動(dòng)日志的一小部分,實(shí)際上日志還能記錄更多的信息。
記錄登陸日志, 利于分析用戶是否正常登陸, 防止其惡意攻擊破解用戶倘若我們記錄用戶的登陸日志,就能利用用戶登陸的頻率、輸入次數(shù)、地理位置等信息,對(duì)其進(jìn)行分析以判斷是否存在異地風(fēng)險(xiǎn)登陸、多次暴力破解等異常情況。
記錄系統(tǒng)的操作日志, 方便數(shù)據(jù)恢復(fù)和定位操作比如一個(gè)醫(yī)院的病歷系統(tǒng),記錄每位患者的就診情況、診斷結(jié)果、治療方案等信息。當(dāng)醫(yī)生誤診或操作失誤時(shí),比如開錯(cuò)藥、做錯(cuò)手術(shù)等,可以根據(jù)系統(tǒng)的操作日志進(jìn)行回滾操作,及時(shí)發(fā)現(xiàn)問(wèn)題并進(jìn)行糾正。同時(shí),系統(tǒng)還可以記錄每位醫(yī)生的操作記錄,便于管理人員進(jìn)行追責(zé)和改進(jìn)工作。
記錄系統(tǒng)執(zhí)行時(shí)間, 方便優(yōu)化程序做數(shù)據(jù)支撐記錄一個(gè)程序開始時(shí)間, 在結(jié)束時(shí)也記錄一下時(shí)間, 從而可以獲取到該程序的執(zhí)行時(shí)間. 執(zhí)行時(shí)間過(guò)長(zhǎng), 那么需要考慮去如何優(yōu)化它.
當(dāng)然, 除了上面列舉的一些作用, 日志還有其他重要用途, 大家可以自行探索
三.如何使用日志
對(duì)于 Spring Boot 中, 它內(nèi)置了 SLF4J 框架, 可以直接在程序中進(jìn)行調(diào)用 SLF4J 來(lái)打印日志, 并且日志一個(gè)門面模式, 何為門面模式呢?
在這舉例來(lái)說(shuō)就像找房子一樣, SLF4J 在這就充當(dāng)了這個(gè)房屋中介的作用, 而它手下不同房子就是它的實(shí)現(xiàn). 例如大平層( Log4j ) 、小洋房(logback ) 、海景別墅( Java Util Logging ). 某一天你需要租一個(gè)房子來(lái)裝你得東西, 你就去找房屋中介, 房屋中介就會(huì)給你介紹上面的幾種房屋類型, 你可以自己進(jìn)行選擇. 比如你選擇了大平層, 你住膩了可以換一個(gè)通過(guò)中介在海景別墅, 這樣你就可以省去找房子的時(shí)間, 想更換只需要通過(guò)中介進(jìn)行更換就可以了
帶入到我們的日志中, 中介就是日志的門面, 中介控制的房子就是日志的實(shí)現(xiàn) , 這樣有什么好處呢 ? 我們不再需要去關(guān)注門面, 托管給別人幫我們做了,只需要去看喜歡那個(gè)房子( 用什么日志方式去輸出就行 ) 有一天住膩了 ( 這個(gè)日志方式出了問(wèn)題 ) 就可以快速的通過(guò)中介在換一個(gè)房子( 換一個(gè)日志方式 )
, 避免在沒有地方可以去( 你所有的日志都用的這個(gè)方法去控制, 沒有中介那你想要換個(gè)房子就需要很長(zhǎng)時(shí)間去修改 )
了解了日志得門面模式以后, 接下來(lái)看看如何自定義實(shí)現(xiàn)也給日志
1. 得到日志對(duì)象
注意級(jí)別根據(jù)上述系統(tǒng)日志的啟動(dòng)記錄可以發(fā)現(xiàn),所有日志信息都屬于同一類別,因此所獲取的日志對(duì)象必定為類級(jí)別的日志對(duì)象,而非僅在某個(gè)具體方法中實(shí)現(xiàn)的方法級(jí)別對(duì)象。
注意作用域啟動(dòng)系統(tǒng)日志后,每個(gè)日志都會(huì)帶有其位置信息,即可以清晰看到其所在的包和類名。因此,為避免日志位置混亂,日志對(duì)象必須私有化,只能在該類內(nèi)使用,而不能在其他類中使用。
注意框架的選擇由于我們?cè)谑褂?SLF4J 作為門面模式時(shí), 去創(chuàng)建日志對(duì)象需要通過(guò)門面去調(diào)用具體的實(shí)現(xiàn)方式, 因此創(chuàng)建日志對(duì)象時(shí)應(yīng)當(dāng)選擇 SLF4J 下的 Logger
綜上, 最終通過(guò) SLF4J 的 Logger 創(chuàng)建一個(gè) log 對(duì)象, 并通過(guò)提供的日志工程去調(diào)用 getLogger ( 因?yàn)槭穷惣?jí)別的, 因此此處選擇類 的 getLogger 方法 )成功創(chuàng)建一個(gè)日志對(duì)象
2. 使用 log 對(duì)象**
訪問(wèn)路由后在控制臺(tái)可以看到如下信息 :
PS : 日志信息打印此處和你們默認(rèn)的不一樣, 我在配置文件中設(shè)置了默認(rèn)等級(jí)為 debug, 日志系統(tǒng)默認(rèn)等級(jí)為 info, 下面會(huì)說(shuō)這個(gè)問(wèn)題,
此處只關(guān)注日志對(duì)象輸出日志有哪些內(nèi)容即可
時(shí)間信息、日志等級(jí)信息、日志位置信息、日志內(nèi)容信息. 可以說(shuō)是非常的齊全日志
四. 日志等級(jí)
日志等級(jí)用于指示日志消息的重要性或嚴(yán)重程度,開發(fā)人員可以設(shè)置日志級(jí)別以過(guò)濾掉不必要的日志消息,同時(shí)也可以根據(jù)日志級(jí)別快速定位和解決日志問(wèn)題。
常見的日志等級(jí)包括:
1.DEBUG:用于調(diào)試或開發(fā)階段,產(chǎn)生大量日志;
2.INFO:提示性消息,用于標(biāo)記應(yīng)用程序的主要分支和進(jìn)度;
3.WARN:警告性消息,用于提示可能會(huì)導(dǎo)致程序問(wèn)題或潛在錯(cuò)誤的情況;
4.ERROR:標(biāo)記錯(cuò)誤事件,用于記錄程序中的錯(cuò)誤;
5.FATAL:嚴(yán)重錯(cuò)誤,可能導(dǎo)致程序崩潰或無(wú)法工作,是最高級(jí)別的日志等級(jí)。
當(dāng)設(shè)置日志級(jí)別時(shí),高級(jí)別的日志消息也會(huì)同時(shí)輸出更低級(jí)別的所有日志消息,例如設(shè)置日志級(jí)別為WARN將輸出所有的WARN、ERROR和FATAL日志消息。
總之,日志等級(jí)是日志記錄中非常重要的一個(gè)概念,它可以幫助開發(fā)人員精確排查和調(diào)試日志問(wèn)題,提高應(yīng)用程序的可維護(hù)性和可讀性。
1.trace : 微量級(jí)別, 級(jí)別最低
2.debug : 需要調(diào)試的時(shí)候使用, 調(diào)試級(jí)別
3.info : 普通的打印信息 ( 日志默認(rèn)的級(jí)別 )
4.warn : 警告, 不影響使用, 但是需要注意的問(wèn)題
4.error : 錯(cuò)誤信息, 級(jí)別比較高的錯(cuò)誤日志信息
6.fatal : 致命的, 因代碼異常導(dǎo)致程序執(zhí)行退出的事件上面就是日志的級(jí)別, 但是我們能夠操作的日志級(jí)別只有前五個(gè), 最后一個(gè)致命的日志級(jí)別是無(wú)法操控的, 當(dāng)程序錯(cuò)誤退出的時(shí)候, 系統(tǒng)會(huì)自動(dòng)幫我們打印fatal 級(jí)別的日志信息.
從上之下, 級(jí)別是越來(lái)越高的, 越往下接收的消息越少, 遵守一個(gè)原則低級(jí)別的無(wú)法查看高級(jí)別的
可以看到, 只能查看到 info、warn 和 error 級(jí)別的錯(cuò)誤信息, 而 trace 和 debug 是無(wú)法查看的, 這是為什么呢 ?當(dāng)我們把 info 注銷掉在看看
可以看到, 只有 info 不見了, 在把 warn 和 error 注釋掉看看
此時(shí)沒有任何日志信息, 可以得到結(jié)論 日志的默認(rèn)等級(jí)是 info, 哪當(dāng)我們想查看 trace 和 debug 的日志信息怎么辦呢 ?
畢竟調(diào)試日志對(duì)于寫程序來(lái)說(shuō)是很重要的, 可以定位問(wèn)題所在 , 下面就介紹一下 Spring Boot 中項(xiàng)目中日志的等級(jí)設(shè)置
五. 日志級(jí)別設(shè)定
開發(fā)人員可以根據(jù)實(shí)際需要設(shè)置日志級(jí)別,從而控制日志輸出的內(nèi)容。通常來(lái)說(shuō),開發(fā)人員應(yīng)該將日志級(jí)別設(shè)置為INFO或者以上級(jí)別,避免輸出過(guò)多無(wú)用信息。同時(shí),可以根據(jù)實(shí)際情況將日志級(jí)別調(diào)整為更高或更低級(jí)別,以滿足具體的需求。
日志級(jí)別的設(shè)定是優(yōu)化日志輸出的關(guān)鍵。在開發(fā)過(guò)程中,合理設(shè)定日志級(jí)別可以幫助開發(fā)人員快速定位、解決程序中的問(wèn)題。因此,開發(fā)人員需要根據(jù)實(shí)際需求,合理設(shè)置日志級(jí)別。在 properties 配置文件中,可以使用以下代碼來(lái)設(shè)置日志等級(jí):
# 設(shè)置日志記錄級(jí)別
log4j.rootLogger=INFO
其中,log4j.rootLogger 表示根日志記錄器,INFO 表示記錄 INFO 級(jí)別及以上的日志信息。如果需要記錄更詳細(xì)的日志,可以將 INFO 換成 DEBUG 或 TRACE。
另外,也可以針對(duì)特定的包或類進(jìn)行日志等級(jí)的設(shè)置,如下所示:
log4j.logger.com.example=DEBUG
其中,com.example 表示需要設(shè)置日志等級(jí)的包或類名,DEBUG 表示記錄 DEBUG 級(jí)別及以上的日志信息?;蛘咴谂渲梦募性O(shè)定日志級(jí)別:完成配置后,我們需要使用 log 方法對(duì)程序執(zhí)行過(guò)程中的信息進(jìn)行記錄。在進(jìn)行觀察之前,建議首先打印一下 log 信息,以便了解程序在執(zhí)行時(shí)的日志情況。根據(jù)配置文件中的設(shè)置,我們可以看到由于默認(rèn)等級(jí)是 debug,因此程序執(zhí)行過(guò)程中 debug 等級(jí)的錯(cuò)誤日志信息可以被記錄下來(lái)。然而,如果想查看比 debug 更低等級(jí)的trace級(jí)別的日志信息的話,就需要將日志等級(jí)設(shè)置為 trace 了。
另外, 配置文件中除了 root(根記錄器 ) 設(shè)置為日志等級(jí)外, 還有更加詳細(xì)的日志等級(jí)設(shè)置, 為特定的包設(shè)置日志等級(jí) ,
例如下面這個(gè)配置文件中, 設(shè)置 com.example 包下的類日志等級(jí)為 info, 而 com.example.demo 包下的日志等級(jí)為 debug
六. 日志的存儲(chǔ)
日志作為記錄系統(tǒng)運(yùn)行狀態(tài)和問(wèn)題的重要組成部分,其存儲(chǔ)方式至關(guān)重要。為了保證系統(tǒng)日志的完整性和可靠性,需要采用合適的存儲(chǔ)方式,通常包括以下幾種:
1.文件存儲(chǔ):將日志記錄到文件中,便于查閱和分析??梢园凑諘r(shí)間、事件等方式進(jìn)行分類保存,也可以對(duì)日志進(jìn)行壓縮和歸檔處理。
2.數(shù)據(jù)庫(kù)存儲(chǔ):將日志記錄到數(shù)據(jù)庫(kù)中,可以方便的進(jìn)行查詢、分析和統(tǒng)計(jì)處理。同時(shí)還可以利用數(shù)據(jù)庫(kù)的事務(wù)機(jī)制保證數(shù)據(jù)的一致性和完整性。
3.日志聚合:將多個(gè)日志源的信息聚合到一起,形成一個(gè)整體的日志記錄。通過(guò)對(duì)這些日志進(jìn)行統(tǒng)計(jì)和分析,可快速定位問(wèn)題和進(jìn)行優(yōu)化。
不同的存儲(chǔ)方式各有優(yōu)劣,需要根據(jù)具體的需求和場(chǎng)景選擇合適的方案。無(wú)論采用何種方式,都要注意日志的保密性和安全性,在存儲(chǔ)和傳輸過(guò)程中采取相應(yīng)的加密和認(rèn)證措施,避免信息泄露和攻擊。當(dāng)然, 日志如此重要不僅僅是因?yàn)樗梢远ㄎ粏?wèn)題, 更重要的時(shí)候它可以作為數(shù)據(jù)分析, 想要數(shù)據(jù)分析肯定不能通過(guò)控制臺(tái) sout 的方式打印日志,
下次啟動(dòng)就沒有了, 因此就必須將日志進(jìn)行持久化, 下面就來(lái)實(shí)現(xiàn)日志的持久化操作
在 yml 配置文件中設(shè)置. 設(shè)置文件路徑, 文件的名稱可以不寫( 寫了生成的就是你設(shè)置的名稱 ), 會(huì)自動(dòng)生成一個(gè)名為 spring.log 的文件
再去運(yùn)行剛剛的 log 方法, 此時(shí)在我剛剛的保存路徑底下就生成了這樣一個(gè) spring.log 文件
當(dāng)我重復(fù)去訪問(wèn)這個(gè)方法時(shí), 它會(huì)重復(fù)打印日志, 我們來(lái)看看會(huì)不會(huì)覆蓋
事實(shí)上, 它是不會(huì)覆蓋的, 如果真的覆蓋了那才是出大問(wèn)題了 !
PS 1 : 在文件的保存路徑設(shè)置中, 如果沒有設(shè)置路徑, 它會(huì)在項(xiàng)目底下生成一個(gè)你設(shè)置的名稱的文件
PS 2 : 在官網(wǎng)中可以看到說(shuō)明, 當(dāng)日志文件超過(guò) 10MB 大小時(shí), 它會(huì)將你后續(xù)得日志文件保存在一個(gè)新的文件中(
并且它會(huì)按照自己的命名規(guī)則替你命名和分割日志 ), 但是這個(gè)日志文件的大小也是可以去設(shè)置的 # 七. 使用Lombok簡(jiǎn)化日志記錄
Lombok是一個(gè)Java庫(kù),通過(guò)注解實(shí)現(xiàn)了簡(jiǎn)化Java代碼的編寫,包括簡(jiǎn)化日志記錄的編寫。在Java應(yīng)用程序中,日志記錄是非常重要的,但是傳統(tǒng)的Java日志記錄方式通常需要編寫大量的冗余代碼。Lombok的日志相關(guān)注解可以讓我們輕松地實(shí)現(xiàn)日志記錄功能,大大減少了代碼量。下面將介紹如何使用Lombok簡(jiǎn)化日志記錄。
1. 添加依賴
首先需要在項(xiàng)目中添加Lombok依賴,具體方式可以在項(xiàng)目的pom.xml文件中添加以下代碼:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2. 使用注解
使用Lombok實(shí)現(xiàn)日志記錄功能非常簡(jiǎn)單,只需要使用@Slf4j注解即可,如下所示:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TestLog {
public static void main(String[] args) {
log.debug("debug message");
log.info("info message");
log.warn("warn message");
log.error("error message");
}
}
@Slf4j注解實(shí)際上會(huì)自動(dòng)為我們生成一個(gè)名為log的靜態(tài)變量,在代碼中可以直接使用log對(duì)象輸出日志信息。當(dāng)然,我們也可以手動(dòng)定義日志對(duì)象,如下所示:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestLog {
private static final Logger LOGGER = LoggerFactory.getLogger(TestLog.class);
public static void main(String[] args) {
LOGGER.debug("debug message");
LOGGER.info("info message");
LOGGER.warn("warn message");
LOGGER.error("error message");
}
}
這里采用了傳統(tǒng)的Java日志記錄方式,不過(guò)使用了Lombok簡(jiǎn)化變量定義的代碼量。
3. 注意事項(xiàng)
在使用Lombok進(jìn)行日志記錄時(shí),需要注意以下幾點(diǎn):
1.需要在項(xiàng)目中正確添加Lombok依賴。
2.在使用Lombok的@Slf4j注解時(shí),需要保證項(xiàng)目中至少引入了一種日志框架。
3.在使用Lombok的@Data注解時(shí),需要特別注意成員變量的訪問(wèn)權(quán)限,避免數(shù)據(jù)泄露問(wèn)題。
4. 總結(jié)
Lombok的日志相關(guān)注解能夠很好地簡(jiǎn)化Java代碼的編寫,特別是對(duì)于Java應(yīng)用程序中頻繁使用的日志記錄功能,使用Lombok可以大大減少代碼量和開發(fā)時(shí)間,提高開發(fā)效率。在使用Lombok進(jìn)行日志記錄時(shí),需要注意Lombok的使用約定和注意事項(xiàng),避免引入不必要的麻煩??梢园l(fā)現(xiàn),在不同類中實(shí)現(xiàn)日志輸出時(shí),都需要手動(dòng)創(chuàng)建日志對(duì)象并修改getLogger方法中的類對(duì)象,這樣操作有些繁瑣。因此,lombok提供了一種更加簡(jiǎn)便的方式來(lái)實(shí)現(xiàn)日志輸出。這個(gè)步驟比較簡(jiǎn)單,只需要手動(dòng)添加 lombok 依賴即可。2. 增加 @slf4j 注解
除了 @slf4j 注解, lombok 還提供許多其他的注解, 您可以前往官網(wǎng)進(jìn)行查看.
關(guān)于Spring Boot的文章就分享到這里,另外給大家準(zhǔn)備了兩個(gè)關(guān)于【Spring Boot入門到精通】以及【手寫Spring Boot源碼實(shí)現(xiàn)】?jī)商追浅8韶浀墓P記,有需要的可以看文章末尾免費(fèi)領(lǐng)??!
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-477369.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-477369.html
到了這里,關(guān)于Spring Boot日志系統(tǒng)大揭秘:從零開始學(xué)習(xí)Spring Boot日志:常見問(wèn)題解答和最佳實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!