2010-05-26 84 views
5

是否有一個最佳實踐,當涉及到把日誌記錄功能在MVC應用程序,例如Zend框架應用程序(Zend_Log進行)?我應該把日誌記錄在控制器還是模型中?還是在兩者?登錄MVC(Zend框架)

如果兩個,他們應該有相同的記錄器或單獨一個?

回答

8

按照Information Expert原則在面向對象設計的GRASP原則:

...放在教學班,以滿足其所需的最信息的責任。

因此,您可以從包含您需要記錄的數據的類寫入日誌。如果要記錄的事件與模型的工作相關,則寫入模型中的日誌。如果事件要記錄屬於控制器的工作,則寫入控制器中的日誌。

做爲其創建一個應用程序日誌輸出。否則,您將不得不搜索許多日誌文件以查找任何診斷信息!您可以在Zend_Registry中存儲日誌對象,以便您可以從應用中的任何課程調用日誌。


回覆您的意見:

最好還是失敗擺好如果logger沒有預期的註冊表項下找到。通過優雅地失敗,我的意思是要麼向stdout(到網頁)或stderr(到httpd服務器日誌)輸出錯誤,要麼拋出異常並讓應用程序處理它。

至於依賴性,這是沒有問題的。任何時候一個班級使用另一個班級,你都有類似的依賴。請參閱Registry設計模式。

+0

但與記錄器從註冊表拉,該模型有一個新的「隱藏」的依賴。如果我在另一個應用程序中使用模型 - 可能沒有記錄或存儲在不同的鍵下 - 那麼嘗試獲取記錄器將失敗。那麼,我的所有模型都應該包含一個包含諸如log(),setLogger(),getLogger()等方法的基礎模型?或者這只是矯枉過正? – 2010-05-27 12:33:32

+0

非常有幫助,非常感謝。 ;-) – 2010-05-29 14:38:38

6

同意Bill Karwin's comment,我也會使用單一的日誌輸出,但也利用了filter errors based on priority(例如,還有一個可以輕鬆設置的螢火蟲記錄器)的功能。

在我們主要的應用程序,我們得到了它也被用來作爲主日誌DB-作家(這是一個簡單的頁面後臺變成了一個RSS源),和電子郵件的嚴重錯誤。非常方便的可排序數據並從中獲取統計數據。