2012-10-10 37 views
1

我希望你們能夠幫助我解決當前面臨的難題。我目前正在研究一個現有的Web應用程序項目,其中一個要求是我們必須集中日誌記錄。該應用程序是由客戶端層(即視圖),服務層,業務層和DAO層組成的分層應用程序。使用Spring AOP集中化日誌記錄

當前,登錄應用程序由控制器方法處理,其中每個控制器方法需要記錄一些信息,通過調用記錄功能手動記錄數據。這些控制器方法處理的請求來自許多不同的客戶端來源,包括移動設備(如電話),Web瀏覽器,Web服務等。目前,所有需要記錄的數據都被捕獲到通用對象中,該對象被傳遞給日誌記錄方法將這些屬性保存到數據庫表中。

問題是這個通用對象就是一個通用對象。它用於許多其他任務,包括日誌記錄,搜索和許多其他任務。當這個通用對象用於日誌記錄時,除了一些屬性之外,用於填充通用對象(在日誌記錄的情況下)的大多數屬性來自請求,即(HttpServletRequest對象) 。由於這個對象的多功能性,這個通用對象有可能被誤用。因此,我們希望擺脫這個通用對象併爲特定任務創建專用對象。在日誌記錄的情況下,我們決定創建一個記錄對象,我們將使用它保存我們需要記錄的數據。我們將使用Spring AOP實現日誌

的難題是這個

1)我們應該使用控制器設置,我們要記錄的新的專門記錄對象的屬性,然後使用AOP通知,檢索日誌對象的持久性一次的控制器方法執行結束

OR

2)應該我們設置新的日誌對象上在AOP通知使用屬性,我們已經放置在一個請求中的屬性對象(即HttpServletRe任務對象)?

我與選項1的問題是,控制器意識到記錄的,也按照良好的設計原則,一個控制器只應該將任務委託給業務和服務層來執行這樣的任務。選項1將意味着控制器不僅僅是委託任務,即它將構建日誌對象

我對選項2的問題是它將我的日誌記錄對象與請求對象(即HttpServletRequest對象)密切連接,因此我我想知道這種方法是否有潛力。

歡迎任何形式的建議,建議和批評。另外,如果有人不得不面對類似的情況,我想聽聽他們如何解決這個問題。

謝謝大家提前。

回答

0

我會使用方面將日誌記錄添加到服務層,表示爲接口。

您可以使用HTTP過濾器或方面從控制器層登錄。

您可以根據需要在多層應用AOP。

+0

感謝您的回覆duffymo。它非常有幫助。只是想知道第二行的答案,即「您可以使用HTTP過濾器或方面從控制器層登錄。」你是否暗示你寧願在控制器方法本身而不是方面/建議中設置日誌對象的屬性?如果是這樣,爲什麼比從HttpServletRequest對象中檢索日誌對象所需的屬性並在通知/方面設置日誌對象的屬性更好? – quophyie

+0

我不在任何控制器中設置日誌屬性。只需添加一個記錄器到方面或過濾器。我使用log4j,所以記錄器屬性完全外化。 – duffymo

+0

感謝您的想法。它會幫助我做出決定 – quophyie