基於AOP的日誌除錯

2021-08-30 14:13:38 字數 2432 閱讀 8644

斷點是我們日常開發最為常見和高效的除錯手段, 相比較輸入日誌它給予更多的狀態資訊和靈活的觀察角度, 但斷點除錯是有前提和侷限的.

# 需要乙個介面友好, 功能強大的ide,

# 比較適合於在單機的開發環境中進行.

企業應用開發中, 我們常常會遇到無法斷點除錯的窘境, 例如:

# 這個異常僅在生產環境出現, 開發環境裡無法重現;

# 存在外部系統依賴, 開發環境無法模擬等.

這迫使我們不得不回到*日誌除錯*的老路子上來.

簡單點的話, 我們用

system.out.println("debug infomation");
就是因為過於簡單, 當需要更多資訊(如執行緒, 時間等), 或是定義輸出模式和形式就需要編寫更多**, 於是我們有了[ log4j].

log4j挺好用的, 只是與`system.out.print`一樣, 在**中隨處可見, 但卻沒有業務價值.

更令人頭痛的是, 並非每次我們都有足夠的經驗告訴自己應該在**新增這些語句, 以致於除錯中不斷的因為調正它們的在**中的位置, 而反覆編譯 - 打包 - 發布系統. 這種體力活, 太沒藝術感了, 囧!

換而言之, 我們會希望:

# 將logging剝離於業務之外, 讓**更易於維護,

# 無需重新編譯,甚至能夠執行時, 可調整輸出日誌的位置.

[ aop]完全可以幫助我們做到上述兩點.

這完全不是什麼新鮮觀點, 這在任何介紹[ aop]文章中, 都會提到logging是其最典型的應用場景.

所以這兒將基於[ guice], 討論如何實現乙個非侵入式的, 且能無需重新編譯即可調正logging位置的簡單示例.

我曾經用過乙個叫[ log4e]的eclipse外掛程式, 它可根據我們預先的配置, 自動的為我們在編寫的**中插入logging的語句, 如方法呼叫的進口和出口:

public int sum(int a, int b)

int result = a + b;

if (logger.isdebugenabled())

}

從上例不難發現, 我們在除錯過程中, 往往會通過乙個方法的進入或退出的狀態(引數, 返回值或異常)來分析問題出在什麼地方. 那麼, 借助 *methodinterceptor* 我們可以這樣做:

public class logginginterceptor implements methodinterceptor  catch (throwable throwable) 

}}

接下來, 我們需要配置這個***, 並向[ guice]宣告它.

public class loggingmodule extends abstractmodule 

}public class main

}

很簡單, 不是嗎? 這樣我們的業務模組的**完全不用編寫輸出日誌的**, 只需要在建立injector的時候加入loggingmodule就可以了.

等等, 好像忘了去實現如何配置日誌輸出的位置. 好吧, 這個其實很簡單:

bindinterceptor(matchers.any(), matchers.any(), new logginginterceptor());

bindinterceptor方法的第乙個引數定義了***將匹配所有類, 第二個引數定義了***將匹配乙個類所有方法. 那麼, 我們要做的僅僅是通過外部引數調整這兩個引數就可以啦. 這兒就演示乙個用正規表示式匹配要logging的方法的例子:

public class methodregexmatcher extends abstractmatcher

}

可惜這種方法不能在執行時調整, 但這也是可以實現的.

還是以用正規表示式匹配要logging的方法為例:

public class logginginterceptor implements methodinterceptor 

@override

public object invoke(methodinvocation invocation) throws throwable catch (throwable throwable)

}}

而後可借助jmx動態調整regex的值, 來實現執行時的配置. 當然, 肯定還會有其它更好的方法, 如果你知道了不妨分享一下.

本文僅以guice為例討論如何改進我們日常開發中除錯的問題, 其實這在spring應用也同樣能夠實現的, 甚至其它應用aop的場景都是可行的.

拓展開來, 不僅是logging, 說不定驗證(測試)也是可行的呢!

有句話不是這樣說的嗎, "思想有多遠, 我們就能走多遠!"

spring mvc 基於aop日誌管理

最近忙於面試換工作,不論是學習還是工作似乎都忽略了spring另外的乙個強大之處 aop 當被面試問道如何基於aop做出乙個單點登入的時候頓時有點傻眼。下來之後做了一番學習。本文以日誌管理為例,說明aop的強大之處。首先,說明一下aop的強大應用。可以簡單實現強大的功能 日誌記錄,效能統計,安全控制...

spring 基於AOP模擬日誌列印

一 控制方法執行列印日誌 執行後列印日誌 讓指定方法列印日誌 1.指定方法列印日誌 1 在invoke 方法中加乙個對method名字的判斷,其中method的名字可以寫在xml檔案中。二 實現 1.ilogger public inte ce iloggerpublic class dlogger...

基於AOP的環繞通知的日誌配置

一.什麼是日誌?在伺服器應用中,日誌起著至關重要的作用,詳細的日誌記錄可以使我們在尋找問題的時候一下就定位到關鍵位置。日誌資訊的關鍵就是明確詳細的記錄問題的位置和出錯資訊。在乙個伺服器介面的入口和退出之前我們往往需要對日誌工具進行說明配置日誌的模組,分類,過濾資訊等等內容。而這些資料,卻是剛好可以使...