2012-10-25 47 views
3

我一直在努力讓log4net在客戶端的演示程序中工作,以便他們可以將其與代碼庫集成。我發現這篇文章做執行http://www.codeproject.com/Articles/14819/How-to-use-log4net時,和描述的步驟 一個是使用AssemblyInfo.cs設置其他程序集的屬性及其背後的機制

第2步:添加下面一行在你的AssemblyInfo.cs文件。

[assembly: log4net.Config.XmlConfigurator(ConfigFile="Web.config", Watch=true)] //For log4net 1.2.10.0 

,一旦我添加了一行代碼到我的AssemblyInfo.cs記錄儀開始工作。

我做了一些Google搜索,試圖理解爲什麼這行是必需的,大多數文檔和註釋聲稱AssemblyInfo是用於可選配置信息的。我不明白爲什麼添加這條線會使我的程序工作; 我的關鍵問題是 - AssemblyInfo.cs中的配置信息如何被拾取和使用(並且是否有一些文檔清楚地描述了這一點) - log4net如何「知道」從AssemblyInfo.cs中獲取該信息?

我從What does the assembly keyword mean in the AssemblyInfo.cs. Does it permit to use method inside?瞭解到,這些是組件上的屬性,但不是它背後的機制。

+1

在一個側面說明,一個集級屬性不是配置log4net的唯一方式:http://logging.apache.org/log4net/release/manual/configuration.html – roken

+0

@roken這也很有趣,我會檢查出 – Aligma

回答

1

好主題。正如你所問,我無法提供一個鏈接,只有幾點,調查結果。我的一些言論可能是衆所周知的。我試圖把它們放在一起,在一個地方。並給出答案如何觸發具有log4Net設置的魔術

  • AssemblyInfo.cs是一個「普通」文件,與任何其他.cs文件一樣,包含例如「 C#的定義。在一個項目文件中它被標記爲「編譯」。換句話說,這是一個按照慣例選擇的地方,應該放置所有的「裝配」屬性。但是它們可能是(,但不應該是)(如果放置在任何項目編譯文件中的特定命名空間聲明之外)。
  • 如果標記爲[AttributeUsage(AttributeTargets.Assembly)],則可以將任何自定義屬性(如log4Net「XmlConfiguratorAttribute」)添加到程序集定義中。
  • 所有屬性只是一個元信息。換句話說,它們是可用的(用於反射),但不是隱式使用。未執行默認
  • (喜歡的AssemblyVersion一些屬性,AssemblyTitle似乎執行,但其意圖和顯式調用由編譯器MAD)

鑑於此,我們可以利用屬性做。我們的(自定義)代碼允許使用反射來檢查是否存在一個屬性,主要是一個特定的已知類型(例如XmlConfiguratorAttribute)。如果存在這樣的屬性,我們可以「執行」它。例如。我正在使用ASP。NET MVC有其「運行時」,它授予任何類型IFilter的屬性將被正確執行。它是MVC運行時,觀察類和方法並顯式執行這些屬性。

AssemblyInfo.cs中唯一聲明的屬性聲明是不夠的。就像上面聲明XmlConfiguration的代碼片段一樣。 Usally會有(也許在Global.asax中的ASP.NET)一些其他呼叫構建器ILOG

ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

好,並在方法的流動某處調用鏈,log4net的內部將是一個檢查,如果存在:

var attributes = Attribute.GetCustomAttributes(thisAssembly, typeof(XmlConfiguratorAttribute)); 

,如果是(組件具有這樣的屬性) - log4net的可以使用它,迫使它做的工作(例如,從XML配置本身)

+0

Hi @Radim感謝您的全面解答。它包括一件特別有趣的事情;程序集指令不包含在AssemblyInfo.cs中,並且該文件只是按照慣例特殊的。我測試了將指令移動到另一個配置記錄器的.cs文件,並且工作得很好。 (當然,我不會把代碼留在那裏:)) – Aligma

0

Log4net的代碼查找調用程序集中的程序集級XmlConfigurator屬性。

它讀取它找到並適當配置自身的屬性的屬性。

+0

hi @SLaks只回答我的問題的一部分,你能否提供更多關於AssemblyInfo.cs的詳細信息或鏈接,解釋它的工作原理? – Aligma

相關問題