切面實現Dubbo請求日誌以及全域性異常處理

2021-10-06 02:48:50 字數 3674 閱讀 1082

專案中經常會看到在所有的rpc介面實現中記錄請求引數,以及try catch,每個方法都來一次,看著就不舒服,類似下面這段**

public cloudserverresponse

updateexpressinfo

",json.

tojsonstring);

cloudserverresponse

cloudserverresponse =

newcloudserverresponse

<

>()

;try

catch

(exception e)

}

public cloudserverresponse

updateexpressinfo

是不是清爽多了:)

@aspect

@slf4j

@configuration

@conditionalonproperty

(name =

"wwdz.rpc.service.log.enabled"

)public

class

dubboserviceaspect

/** * 任何持有@transactional註解的方法

*/@pointcut

(value =

"@annotation(org.springframework.transaction.annotation.transactional)"

)private

void

transactionalpointcut()

/** * 異常處理切面

* 將異常包裝為response,避免dubbo進行包裝

** @param pjp 處理點

* @return object

*/@around

("servicepointcut() && !transactionalpointcut()"

)public object doaround

(proceedingjoinpoint pjp)

catch

(bizexception e)

catch

(throwable e)

}/**

* 記錄請求成功日誌

* @param joinpoint

* @param args

* @param result

* @param startcurrenttimemillis

*/private

void

processsuccessfullog

(proceedingjoinpoint joinpoint, object[

] args, object result, long startcurrenttimemillis)

}/**

* 任何持有@transactional註解的方法異常處理切面

* 將自定義的業務異常轉為runtimeexception:

* 1.規避dubbo的包裝,讓customer可以正常獲取message

* 2.丟擲runtimeexception使事務可以正確回滾

* 其他異常不處理

** @param pjp 處理點

* @return object

*/@around

("servicepointcut() && transactionalpointcut()"

)public object dotransactionalaround

(proceedingjoinpoint pjp)

throws throwable

catch

(throwable e)

}/**

* 處理異常

* @param joinpoint 切點

* @param args 引數

* @param throwable 異常

* @param startcurrenttimemillis

*/private

void

proces***ception

(final proceedingjoinpoint joinpoint,

final object[

] args, throwable throwable, long startcurrenttimemillis)

/** * 拼接入參

* @param args

* @return

*/private string logargs

(object[

] args)

list

usableargs =

newarraylist

<

>()

; collections.

addall

(usableargs, args)

;return

"request: "

+ jsonobject.

tojsonstring

(usableargs)

+"\n";}

/** * 拼接出參

* @param retval

* @return

*/private string logresponse

(object retval)

/** * 拼接服務介面資訊

* @param joinpoint

* @return

*/private string logservicemsg

(final proceedingjoinpoint joinpoint)

/** * 拼接執行時間

* @param startcurrenttimemillis

* @return

*/private string logtimemillis

(long startcurrenttimemillis)

}

以上**註解應該挺清楚,**也比較簡單,使用的時候注意要在配置中新增一下,預設是不開啟的

wwdz.rpc.service.log.enabled =

true

還有一點要注意,假如有一些請求入參或者請求結果很大,日誌檔案可能會暴漲,這種情況下如果確定這個日誌沒有太大的價值,可以在方法上加@unlog註解,遮蔽這個方法的日誌

/**

* 註解加上後不打請求日誌

*/@retention

(retentionpolicy.runtime)

@target

(elementtype.method)

public @inte***ce

unlog

執行一下,看看日誌列印的結果:

服務名service

入參request

結果response

耗時timemillis

都打出來了

異常日誌

SpringAop切面實現日誌記錄

springaop切面實現日誌記錄 實現 原因 spring在處理中,可能是因為我的專案有事務,serviceimpl的方法被 後直接得不到了。換乙個思路 先得到自己的父類,然後通過父類得到真實的自己 解決方法 1 2 這個方法幫忙拿出註解中的operation屬性 3 因為有攔截serviceim...

AOP切面實現方法日誌列印耗時計算

很簡單,通過aop實現每個方法訪問時候統一進行日誌列印和耗時計算,在spring配置xml檔案中設定啟用aop aspect component public class loggingaspect args resultdata joinpoint.proceed args long endtim...

問題定位切面和日誌上列印請求唯一log標識

這篇部落格主要是針對我們前期部分介面不穩定和有部分介面需要大量業務溝通介面,針對請求引數和返回引數進行列印。部分介面呼叫邏輯鏈過長,不易分析新增同乙個請求的引數新增唯一標識,防止併發比較大情況,找不到同一請求介面的上下文資訊。1 構建乙個註解用於放置在需要列印介面上面 documented targ...