拋出異常時仍然需要記錄錯誤日志

場景:當service的方法執行拋出異常時,事務會發生回滾,導致無法記錄錯誤日志

解決:切面

其他:1.日志需要記錄日志標題,保存入參

? ? ? ? ? ?2.失敗時會拋出異常;日志需要判斷執行是否成功,記錄狀態

? ? ? ? ? ?3.只是模擬操作,實際情況需要將日志保存到數據庫

引入依賴:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

代碼:

1. 日志記錄時需要加標題,每個方法的日志標題不一樣,解決辦法是切面+自定義注解

package com.test.Annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {String logTitle() default "";//日志標題
}

?controller的方法上加注解:

 @LogAnnotation(logTitle = "post測試")@PostMapping("/login")public String login(@RequestBody Department department) throws Exception{return "hello World";}

2. 配置切面

package com.test.aspect;import com.test.Annotation.LogAnnotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Arrays;@Aspect
@Component
public class LogAspect {@Autowiredprivate HttpServletRequest request;//    @Pointcut("@annotation(com.test.aspect.LogAnnotation)") //單獨設置@Pointcut("execution(* com.test.controller.*.*(..)) && @annotation(com.test.Annotation.LogAnnotation)") //同時設置public void pt() {}@Around("pt()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {Object result = null;try{MethodSignature signature = (MethodSignature)joinPoint.getSignature();Method method = signature.getMethod();LogAnnotation logAnnotation =method.getAnnotation(LogAnnotation.class);System.out.println("@anno logtitle = " + logAnnotation.logTitle());//自定義注解-日志名稱System.out.println("method = " + method.getName());//方法名System.out.println("params = " + Arrays.toString(joinPoint.getArgs()));//參數,post和get都可以獲取;也可以轉為JSON格式result = joinPoint.proceed();//執行結果,即response返回的數據System.out.println("response = " + result);//todo:記錄狀態為true的日志,dao操作省略return result;}catch (Exception e) {//如果controller的方法執行時發生異常,會被捕獲異常,可以在這里記錄錯誤日志System.out.println("method has exception, e = " + e);//todo:記錄狀態為false的日志,dao操作省略}return result;}
}

3.測試

3.1 get測試:?發送請求:http://localhost:8081/hello?userId=abc

a. get測試-正常請求時

@LogAnnotation(logTitle = "get測試")@GetMapping("/hello")public String hello(@RequestParam(value="userId", required = false) String userId) throws Exception{return "hello World";}

打印:

@anno logtitle = get測試
method = hello
params = [abc]
response = hello World

b. get測試-拋出異常時

@LogAnnotation(logTitle = "get測試")@GetMapping("/hello")public String hello(@RequestParam(value="userId", required = false) String userId) throws Exception{try {int i = 1/0;}catch (Exception e) {throw new Exception("eeeeeee");}return "hello World";}

打印:

@anno logtitle = get測試
method = hello
params = [abc]
method has exception, e = java.lang.Exception: eeeeeee

3.2 post請求

@LogAnnotation(logTitle = "post測試")@PostMapping("/login")public String login(@RequestBody Department department) throws Exception{return "登錄成功";}

post請求,路徑:localhost:8081/login

body:

{"id":1,"departName":"部門名稱"
}

打印

@anno logtitle = post測試
method = login
params = [Department(id=1, departName=部門名稱)]
response = 登錄成功

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

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

相關文章

2024年漢字小達人活動4個多月開賽:18道歷年選擇題和答案、解析

根據近年的安排&#xff0c;2024年第11屆漢字小達人比賽還有4個多月就啟動&#xff0c;那么孩子們如何利用這段時間有條不紊地備考呢&#xff1f;我的建議是兩手準備&#xff1a;①把小學1-5年級的語文課本上的知識點熟悉&#xff0c;重點是字、詞、成語、古詩。②把歷年真題刷…

聯想端游聯運SDK接入指南

1. 接入流程 本文檔主要介紹了 聯想PC游戲SDK接入流程、聯想游戲提供的功能、接入注意事項等。 1.1. 接入方式 1. 聯想游戲SDK2.1版本支持“賬號防沉迷支付”接入方式&#xff1b; a. 聯想提供賬號注冊、登錄等能力 b. 聯想提供防沉迷服務 c. 聯想提供游戲內支付 1.2. 對…

【學習筆記】計算機組成原理(八)

CPU 的結構和功能 文章目錄 CPU 的結構和功能8.1 CPU的結構8.1.1 CPU的功能8.1.2 CPU結構框圖8.1.3 CPU的寄存器8.1.4 控制單元CU和中斷系統 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的數據流 8.3 指令流水8.3.1 指令流水原理8.3.2 影響流水線性能的因素8.3.3 流水…

meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能對比測試

本文會使用如下兩個項目&#xff1a;meinheld-gunicorn-flask 與 uvicorn-gunicorn-fastapi 前文有測過 Flask vs FastApi 性能對比測試&#xff0c;可能不夠有說服力&#xff0c;這次使用了號稱最快的wsgi或asgi服務器gunicorn來運行flask或fastapi。 上面meinheld-gunicorn…

數據庫-SQL性能分析

SQL執行頻率 慢查詢日志 慢查詢日志記錄了所有執行時間超過指定參數&#xff08;long_query_time&#xff0c;單位&#xff1a;秒&#xff0c;默認10秒&#xff09;的所有 SQL語句的日志。 MySQL的慢查詢日志默認沒有開啟&#xff0c;我們可以查看一下系統變量 slow_query_l…

html5 筆記02

目錄 01 svg的基本使用 02 svg繪圖 03 進程和線程 01 svg的基本使用 svg和canvas的區別: canvas: 1.canvas作為一個容器只有一個dom元素 ,內部元素無法使用dom操作 (canvas不能展開然后選擇不到 svg查看元素能選中因為是通過標簽控制的) 2.canvas 是配合js完成各種繪制效果 …

vue-route的路由配置中父組件沒有component怎么處理

概述 為了方便開發和維護&#xff0c;所以web前端的路由配置路徑和前端代碼文件路徑一般是一致的。但在實際開發中&#xff0c;項目可能會分很多級的菜單&#xff0c;由于很多菜單只有葉子菜單是真正的頁面。而中間菜單項只是一個路由配置。 為了正確路由到底層的功能頁面&…

指紋識別概念解析

目錄 1. 指紋是物證之首 1.1 起源于中國 1.2 發展于歐洲 1.3 流行于全世界 2. 指紋圖像 3. 指紋特征 4. 指紋注冊 5. 指紋驗證 6. 指紋辨識 1. 指紋是物證之首 指紋識別技術起源于中國、發展于歐洲、流行于全世界。自20世紀以來&#xff0c;指紋在偵破刑事案件、解決訴…

水泥超低排平臺哪家好?

隨著環保政策的加強和綠色發展理念的深入人心&#xff0c;水泥行業的超低排放改造已成為行業發展的新趨勢。選擇一個合適的水泥超低排平臺對于確保改造效果和實現企業的可持續發展至關重要。朗觀視覺小編將從多個角度出發&#xff0c;為您提供一份綜合評估與選擇攻略&#xff0…

Spring Boot 3.x 與 Spring Boot 2.x 的對比

Spring Boot 是 Java 開發領域的一個重要框架&#xff0c;它簡化了基于 Spring 的應用開發。隨著版本的不斷更新&#xff0c;Spring Boot 提供了更多功能、更好的性能以及更簡潔的配置。本文將詳細對比 Spring Boot 3.x 和 Spring Boot 2.x&#xff0c;探討它們之間的主要區別和…

[C語言]自定義類型詳解:結構體、聯合體、枚舉

目錄 &#x1f680;結構體 &#x1f525;結構體類型的聲明 &#x1f525;結構的自引用 &#x1f525;結構體變量的定義和初始化 &#x1f525;結構體內存對齊 &#x1f525;結構體傳參 &#x1f525;結構體實現位段&#xff08;位段的填充&可移植性&#xff09; &a…

安裝 Ubuntu桌面版,詳細步驟(附引導 U盤制作工具)

下載鏡像 安裝Ubuntu首先要下載鏡像包&#xff0c;訪問下面網址下載鏡像包 https://releases.ubuntu.com/ 選擇你要安裝的Ubuntu版本 將 .iso 文件保存到所需位置&#xff0c;下面會使用此文件創建可引導 U盤。 制作 Ubuntu 引導 U 盤 首先要找到一個大于4G的U盤&#xff…

貓頭虎 解析:為什么AIGC在國內適合做TOB,在國外適合做TOC?

貓頭虎 解析&#xff1a;為什么AIGC在國內適合做TOB&#xff0c;在國外適合做TOC&#xff1f; 博主 貓頭虎 的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面…

ps進程查看命令詳解

1、PS 命令是什么 查看它的man手冊可以看到&#xff0c;ps命令能夠給出當前系統中進程的快照。它能捕獲系統在某一事件的進程狀態。如果你想不斷更新查看的這個狀態&#xff0c;可以使用top命令。 2、ps命令支持三種使用的語法格式 UNIX 風格&#xff0c;選項可以組合在一起…

鴻蒙ArkUI-X平臺差異化:【運行態差異化(@ohos.deviceInfo)】

平臺差異化 簡介 跨平臺使用場景是一套ArkTS代碼運行在多個終端設備上&#xff0c;如Android、iOS、OpenHarmony&#xff08;含基于OpenHarmony發行的商業版&#xff0c;如HarmonyOS Next&#xff09;。當不同平臺業務邏輯不同&#xff0c;或使用了不支持跨平臺的API&#xf…

c++中靜態函數

在Qt中&#xff0c;可以通過在類中定義靜態方法來添加靜態方法。靜態方法是類的一部分&#xff0c;但不需要實例化類對象就可以直接調用。 下面是一個示例&#xff0c;演示了如何在類中添加靜態方法&#xff1a; cpp class MyClass { public: static void myStaticMethod…

Postman快捷功能-批量斷言與快速查詢替換

大家好&#xff0c;在我們日常的接口測試工作中&#xff0c;經常需要對接口返回的數據進行斷言&#xff0c;以確保接口的正確性。當接口數量較多時&#xff0c;逐個編寫斷言語句會變得非常繁瑣。此外&#xff0c;在接口測試過程中&#xff0c;我們還可能需要頻繁地查找和替換某…

Python自動化工具(桌面自動化、Web自動化、游戲輔助)

工具介紹 連點工具是一款可以模擬鍵鼠后臺操作的連點器工具。支持鼠標連點、鍵鼠腳本錄制&#xff0c;支持輔助您實現辦公自動化以及輔助游戲操作。功能簡潔易用&#xff0c;非常方便操作。連點工具讓您在在玩游戲、網購搶購的時候全自動點擊鼠標&#xff01;主要功能有&#…

MySQL數據庫的數據文件保存在哪?MySQL數據存在哪里

在安裝好MySQL數據庫使用一段時間后&#xff0c;會產生許多的數據庫和數據。那這些數據庫的數據文件存放在本地文件夾的什么位置呢 一、默認位置 一般來說MySQL數據庫的數據文件都是存放在data文件夾之中&#xff0c;但是根據使用的存儲引擎不同&#xff0c;產生的一些文件也…

牛客前端面試高頻八股總結(2)(附文檔)

1.fetch請求方式 fetch是什么&#xff1f; fetch是一種http 數據請求的方式&#xff0c;是xml的一種替代方式。 怎么請求&#xff1f; fetch方法返回一個promise解析response顯示狀態&#xff08;成功與否&#xff09;的方法。 優點&#xff1a; 使用Promise&#xff0c;支持鏈…