2012-02-10 116 views
9

我正在與Orchard CMS合作,對我來說更好的CMS。我想了解它如何進行日誌記錄以及我是否可以添加自己的日誌記錄。我看到果園使用NullLogger類,它沒有工作。我打開了App_Data.Logs文件夾,並看到有日誌文件。但是如何?我在代碼中搜索替換NullLogger與log4net(我猜這是log4net,因爲日誌格式和log4net.config的格式非常相似),但我還沒有找到這個技巧。 有人可以回答我:Orchard CMS如何進行日誌記錄?

  1. Orchard如何進行日誌記錄?
  2. 我是否可以添加自己的記錄器,如果是,有哪些最佳實踐可以做到這一點?

謝謝安德烈。

回答

16

Autofac模塊(確切地說Orchard.Logging.LoggerModule)處理它。基本上 - 它掃描每個依賴項並填充​​類型的所有屬性,並引用相應的記錄器實例。每個依賴項都會獲得自己的記錄器,其名稱等於包含類的完整類型名稱(包括名稱空間)的

NullLogger只是一個佔位符,因此在屬性由Autofac設置之前,訪問屬性不會拋出NullReferenceException

擴展默認的日誌作爲它會涉及做三件事情相當複雜的任務:

  • 創建ILoggerFactory(就像默認Orchard.Logging.CastleLoggerFactory)的自定義實現和
  • 創建Autofac模塊在容器寄存器該實現(如所提到的LoggerModule確實)
  • 抑制當前的默認升通過裝飾你的新的與[OrchardSuppressDependency("Orchard.Logging.LoggingModule")]

UPDATE ogging模塊

剛剛意識到我沒有解決此問題的最重要的部分:) 是,果園使用log4net的所以你可通過Config/log4net.config文件更改默認設置。

+0

非常感謝,對我很有幫助。但我還不明白在當前使用的記錄器配置的Orchard的哪個地方。它在log4net.config文件或其他地方? – 2012-02-10 10:48:29

+0

好的,我找到了答案。它確實使用log4net.config文件。謝謝。 – 2012-02-10 11:42:53

+0

有沒有一種方法可以創建一個記錄器來處理特定命名空間的所有日誌記錄?或者是特定的班級? – 2014-12-10 19:35:21

1

有一篇關於Orchard Logging如何工作的文章。 (我不確定是否可以複製和粘貼整篇文章)。這是鏈接:Injection Logger in Orchard

因此,關鍵是這樣的:

每當類需要一個Logger實例,它需要做的一切都是爲了 聲明ILogger屬性,僅此而已。然後,在你的班級裏,你可以使用這個屬性來隨時登錄

這是怎麼完成的?

當Orchard web應用程序啓動時,OrchardStarter將使用 來完成大部分的註冊工作。

幾句話,它會在所有項目的所有代碼,獲取所有使用的ILogger屬性的類,並實現它,你(如果未實現),使用城堡的記錄器工廠。