【JavaEE進階】SpringBoot 日志

文章目錄

  • 一. 日志有什么用?
  • 二. 自定義日志打印
    • 1. 日志的使用與打印
  • 三. 日志級別
    • 1. 日志級別有什么用?
    • 2. 日志級別的分類及使用
  • 四. 日志持久化
  • 五. 更簡單的日志輸出---Lombok
    • 1. Lombok的使用
    • 2. lombok原理解釋
      • 2.1 Lombok更多注解說明

一. 日志有什么用?

在Java中,日志是一種記錄和追蹤應用程序運行時信息的重要工具.以下是日志在Java中的幾個主要用途:

  1. 調試和故障排查:通過輸出詳細的日志消息,可以幫助開發人員調試代碼并解決問題。日志可以記錄關鍵的變量值、函數調用堆棧等信息,從而更好地定位和修復 bug。
  2. 運行時監控:日志可以用于監控應用程序的運行情況,例如記錄關鍵指標(如請求處理時間、數據庫查詢次數)以及異常情況。這些信息可以用來分析應用程序性能、發現潛在的瓶頸或異常行為,并進行相應的優化和調整。
  3. 安全審計和合規性:日志記錄可以用于安全審計和合規性檢查。通過記錄關鍵事件和操作,可以提供追蹤和審計的能力,了解系統的用戶行為、權限變更等情況,以便跟蹤不當行為或滿足法規要求。
  4. 性能分析:通過分析應用程序的日志,可以評估其性能,并找出潛在的性能問題和瓶頸。通過記錄請求響應時間、資源使用情況等數據,可以對應用程序的性能進行實時監測和優化。
  5. 記錄用戶登錄日志,方便分析用戶是正常登錄還是惡意破解?戶。記錄系統的操作日志,方便數據恢復和定位操作?。記錄程序的執行時間,方便為以后優化程序提供數據支持.

Java中有多種日志框架可供選擇,如Log4jLogbackjava.util.logging等。這些日志框架提供了豐富的功能和配置選項,可以根據需求靈活地記錄日志,并支持將日志輸出到不同的目標(如控制臺、文件、數據庫等)。

Spring Boot中,可以通過使用日志框架來記錄應用程序的日志。Spring Boot默認使用的是SLF4J(Simple Logging Facade for Java),并且集成了常用的日志實現框架,如LogbackLog4j2
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

二. 自定義日志打印

程序員自定義打印日志的實現步驟:

  1. 在程序中得到日志對象.
  2. 使用日志對象的相關語法輸出要打印的內容

1. 日志的使用與打印

  1. pom.xml中添加以下依賴:
		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>
  1. 配置日志級別:在application.propertiesapplication.yml中配置日志級別。可以設置根級別日志以及特定類或包的日志級別。例如,要將根級別日志設置為info級別,可以在配置文件中添加以下配置:在這里插入圖片描述
  2. 記錄日志:在代碼中使用日志打印語句記錄日志。Spring Boot通過@Autowired注解將日志對象注入到代碼中,可以直接使用。例如,在一個Controller類中,可以這樣使用日志:
package com.example.demo;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 MyController {private static final Logger logger = LoggerFactory.getLogger(MyController.class);//步驟一@RequestMapping("/hello")public String home() {logger.info("Hello, info!");//步驟二return "Welcome to my application!";}
}

注意此處導入的包是import org.slf4j.Logger;關于Logger的包有很多,注意不要導錯了.
在這里插入圖片描述

在網頁中訪問:http://localhost:8888/hello
結果如下:
在這里插入圖片描述
同時再控制臺中我們可以看到以下日志信息:
在這里插入圖片描述
注意:Spring Boot還提供了一些特殊的日志記錄器,如logging.filelogging.path等,用于指定日志文件的位置和名稱。此外,還可以使用logging.pattern.consolelogging.pattern.file等屬性來自定義控制臺和文件日志的輸出格式。

下來我們試一下不同日志級別的打印以及日志各部分詳情介紹:
在這里插入圖片描述
那么就有小伙伴疑惑,為什么`logger.trace(“Hello, trace!”); logger.debug(“Hello,debug!”);``這兩行沒有打印呢?這與日志的級別有關:

三. 日志級別

1. 日志級別有什么用?

日志級別用于控制日志輸出的詳細程度,可以根據需求選擇合適的級別來記錄和查看日志信息。通過設置適當的日志級別,可以靈活地控制日志的輸出量和詳細程度。在開發和調試階段可以使用較低的日志級別(如DEBUG),以獲得更多的信息幫助排查問題。而在生產環境中,可以將日志級別設置為較高的級別(如INFO或WARN),以減少日志輸出并降低對性能的影響。
此外,日志級別還可以根據具體的應用程序需求進行擴展和自定義。例如,可以定義自己的日志級別來表示特定的業務場景或關鍵事件。

2. 日志級別的分類及使用

?志的級別分為:

  1. TRACE(追蹤):最詳細的日志級別,通常用于跟蹤代碼執行路徑、變量狀態等詳細信息。在生產環境中很少使用,因為它會產生大量的日志輸出。

  2. DEBUG(調試):用于開發和調試階段,輸出較為詳細的日志信息,有助于理解代碼的執行過程和檢測問題。在生產環境中一般不建議使用,因為它會產生大量的日志輸出。

  3. INFO(信息):用于輸出重要的業務信息,如應用程序啟動信息、關鍵操作完成信息等。通常會記錄應用程序運行中的重要事件,可以用于監控和分析。

  4. WARN(警告):表示潛在的錯誤情況,可能會導致應用程序出現異常或不正常的行為,但不會造成嚴重的系統故障。例如,某些配置項未設置、數據庫連接超時等。需要引起注意,但不會影響應用程序的正常運行。

  5. ERROR(錯誤):表示發生了可恢復的錯誤,導致應用程序無法正常執行某些功能或服務。例如,數據庫連接失敗、請求處理異常等。需要開發人員關注并及時處理。

  6. FATAL(致命):表示發生了無法恢復的嚴重錯誤,這通常會導致應用程序崩潰或無法繼續執行。例如,關鍵依賴項啟動失敗、文件系統不可用等。

在這里插入圖片描述
級別越高,接收到的消息就越少,如設置了 warn 就只能收到 warn、error、fatal 級別的日志了。
日志級別配置只需要在配置文件中設置“logging.level”配置項即可,如下所示:
在這里插入圖片描述

此時就只打印error級別及以上的日志了:
在這里插入圖片描述
默認日志輸出級別
清除掉配置?件中的日志設置,觀察控制臺輸?的日志級別。
得到以下結論,日志的輸出級別,默認是 info

四. 日志持久化

上述日志都是輸出在控制臺上的,然而在生產環境上我們需要將日志保存下來,以便出現問題之后追溯問題,把日志保存下來的過程就叫做持久化.以下是在Spring Boot中進行日志持久化的步驟:

  1. 添加依賴:在項目的pom.xml文件中添加日志框架的依賴。可以通過Spring Boot Starter依賴簡化配置的過程,例如對于Logback,可以添加spring-boot-starter-logging依賴。
		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>
  1. 配置文件:在application.propertiesapplication.yml中進行相應的配置。具體配置方式取決于所選擇的日志框架。
logging:file:
#    設置日志文件的目錄path: E:\\JavaEE\\logger
#    設置日志文件的名字name: E:\\JavaEE\\logger\\SpringBootDemoLog.log

我們可以在E:\\JavaEE\\logger目錄中看到以下文件:
在這里插入圖片描述
可以看到文件中記錄了當前運行的日志信息:
在這里插入圖片描述

五. 更簡單的日志輸出—Lombok

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁瑣,且每個類都添加?遍,也很麻煩,這里講?
種更好?的日志輸出方式,使用 lombok 來更簡單的輸出。

  1. 添加 lombok 框架?持。
  2. 使? @slf4j 注解輸出?志。

1. Lombok的使用

添加Lombok依賴:

		<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
package com.example.demo;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {@RequestMapping("/log")public void loggerTest() {log.error("------------------- error -----------------");}
}

運行結果:
在這里插入圖片描述

2. lombok原理解釋

lombok 能夠打印?志的密碼就在 target ?錄??,target 為項?最終執?的代碼,查看 target ?錄如下:

在這里插入圖片描述
Java程序運行原理:
在這里插入圖片描述
Lombok的作用如下圖所示:
在這里插入圖片描述
Lombok的運行原理是通過注解處理器在編譯時對源代碼進行解析和轉換,生成對應的代碼片段,并將其插入到編譯過程中的抽象語法樹中,從而簡化Java類的編寫。這樣可以減少開發者編寫重復、繁瑣的代碼,提高開發效率。

2.1 Lombok更多注解說明

基本注解:

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

組合注解:

注解作?
@Data@Getter + @Setter + @ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@NoArgsConstructor
@Slf4j添加?個名為 log 的?志,使? slf4j

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36376.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【結構型設計模式】C#設計模式之外觀模式

題目描述&#xff1a; 假設你正在開發一個音樂播放器應用程序&#xff0c;該應用程序需要與多個子系統進行交互&#xff0c;包括音頻解碼、音量控制和播放控制等。請使用外觀模式設計一個音樂播放器的外觀類&#xff0c;并實現相應的子系統類。 要求&#xff1a; 創建一個外觀…

【gogogo專欄】指針

go語言指針 為什么需要指針指針使用實例值傳遞地址傳遞多級指針 為什么需要指針 作為一個大學劃水&#xff0c;畢業一直寫java的程序員來說&#xff0c;多多少少對于指針有點陌生&#xff0c;由于近期需要轉go&#xff0c;正好學到指針這里&#xff0c;就來探究下指針的使用場景…

ThreadLocal詳解

ThreadLocal詳解 一、故事背景二、知識點主要構成1、什么是ThreadLocal&#xff1f;2、ThreadLocal的基本使用內存泄漏問題引用類型&#xff1a;強引用&#xff1a;軟引用弱引用虛引用 ThreadLocal內存泄漏原因 三、總結提升 一、故事背景 最近在學習并發編程相關內容&#xf…

pycharm 安裝庫

這是另一種方式。 搜索到的安裝庫的方式多數是&#xff1a;在桌面上winR鍵運行終端&#xff0c;輸入命令&#xff0c;安裝不了&#xff0c;發現安裝不了。 1、打開pycharm&#xff1b; 2、軟件下部的Terminal終端(需要運行一個代碼才能出現&#xff0c;任何代碼都可)&#xf…

Es、kibana安裝教程-ES(二)

上篇文章介紹了ES負責數據存儲&#xff0c;計算和搜索&#xff0c;他與傳統數據庫不同&#xff0c;是基于倒排索引來解決問題的。Kibana是es可視化工具。 分布式搜索ElasticSearch-ES&#xff08;一&#xff09; 一、ElasticSearch安裝 官網下載地址&#xff1a;https://www…

[C語言] 指針

1. 指針是什么 2. 指針和指針類型 3. 野指針 4. 指針運算 5. 指針和數組 6. 二級指針 7. 指針數組 目錄 1. 指針是什么&#xff1f; 2. 指針和指針類型 2.1 指針-整數 2.2 指針的解引用 3. 野指針 3.1 野指針成因 3.2 如何規避野指針 4. 指針運算 4.1 指針…

不用技術代碼,分班查詢系統怎么做?

暑假即將結束&#xff0c;新學期開始將面臨分班信息公布的工作&#xff01;對于分班信息公布&#xff0c;涉及到學生的個人信息&#xff0c;包括姓名、學號、班級等。在發布這些信息時&#xff0c;必須確保數據的保密性&#xff0c;防止未經授權的人員獲取到學生的個人信息。因…

對字符串中所有單詞進行倒排-C語言/Java

描述 輸入一個字符串&#xff0c;輸出字符串中單詞的倒序。 要求 構成單詞的字符只有26個大寫或小寫英文字母。非構成單詞的字符均視為單詞間隔符&#xff1b;倒排后的單詞間隔符以一個空格表示&#xff1b;如果原字符串中相鄰單詞間有多個間隔符時&#xff0c;倒排轉換后也只…

docker的服務/容器缺少vim問題

背景/問題&#xff1a; docker的服務/容器缺少vim問題 bash: vim: command not found 在docker的mysql服務中安裝Vim 1、執行apt-get update root6d8d17e320a0:/# apt-get update問題:文件下載失敗 Err:1 http://security.debian.org/debian-security buster/updates InRe…

【Linux】程序地址空間

程序地址空間 首先引入地址空間的作用什么是地址空間為什么要有地址空間 首先引入地址空間的作用 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int g_val 100;6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 int cn…

自動方向識別式 LSF型電平轉換芯片

大家好&#xff0c;這里是大話硬件。 今天這篇文章想分享一下電平轉換芯片相關的內容。 其實在之前的文章分享過一篇關于電平轉換芯片的相關內容&#xff0c;具體可以看鏈接《高速電路邏輯電平轉換設計》。當時這篇文章也是分析的電平轉換芯片&#xff0c;不過那時候更多的是…

矩陣的轉置

題目&#xff1a; 給你一個二維整數數組 matrix&#xff0c; 返回 matrix 的 轉置矩陣 。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 輸出&#xff1a;[[1,4,7],[2,5,8],[3,6,9]]class Solution(object):def transpose(self, matrix):"&q…

JMeter 的并發設置教程

JMeter 是一個功能強大的性能測試工具&#xff0c;可以模擬許多用戶同時訪問應用程序的情況。在使用 JMeter 進行性能測試時&#xff0c;設置并發是非常重要的。本文將介紹如何在 JMeter 中設置并發和查看報告。 設置并發 并發是在線程組下的線程屬性中設置的。 線程數&#…

3.解構賦值

解構賦值是一種快速為變量賦值的簡潔語法&#xff0c;本質上仍然是為變量賦值。 3.1數組解構 數組解構是 將數組的單元值快速批量賦值給一系列變量 的簡潔語法 1.基本語法: &#xff08;1&#xff09;賦值運算符左側的[ ]用于批量聲明變量&#xff0c;右側數組的單元值將被賦…

前后端分離------后端創建筆記(04)前后端對接

本文章轉載于【SpringBootVue】全網最簡單但實用的前后端分離項目實戰筆記 - 前端_大菜007的博客-CSDN博客 僅用于學習和討論&#xff0c;如有侵權請聯系 源碼&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

【JavaEE進階】Bean 作用域和生命周期

文章目錄 一. 關于Bean作用域的實例1. lombok2. 實例代碼 二. 作用域定義1. Bean的六種作用域2. 設置作用域 三. Spring 執行流程和 Bean 的生命周期1. Spring 執行流程2. Bean生命周期 一. 關于Bean作用域的實例 注意在此例子中需要用到lombok 1. lombok lombok是什么? Lo…

【C#】判斷打印機共享狀態

打印機共享狀態 /// <summary>/// 打印機共享狀態/// </summary>public enum PrinterShareState{/// <summary>/// 無打印機/// </summary>None -1,/// <summary>/// 未共享/// </summary>NotShare 0,/// <summary>/// 已共享/// …

soap通信2

首先&#xff0c;定義一個XSD&#xff08;XML Schema Definition&#xff09;來描述你的數據結構。在你的Maven項目的src/main/resources目錄下&#xff0c;創建一個名為schemas的文件夾&#xff0c;并在其中創建一個名為scriptService.xsd的文件&#xff0c;內容如下&#xff…

【kubernetes】調度約束

目錄 調度約束 Pod 啟動典型創建過程如下 調度過程 指定調度節點 查看詳細事件&#xff08;發現未經過 scheduler 調度分配&#xff09; 獲取標簽幫助 需要獲取 node 上的 NAME 名稱 給對應的 node 設置標簽分別為 ggls 和 gglm 查看標簽 修改成 nodeSelector 調度方…

vue學習筆記

1.官網 v2官網 https://v2.cn.vuejs.org/ v3官網 https://cn.vuejs.org/ 2.vue引入 在線引入 <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> 下載引入(下載鏈接) https://v2.cn.vuejs.org/js/vue.js 3.初始化渲…