2010-10-15 131 views
2

我最近創建了Windows服務。它忠實地做的一件事就是將任何錯誤記錄到應用程序日誌中。我有以下的代碼,這是否:正確使用應用程序配置文件中的<system.diagnostics>設置

Dim appLog = New System.Diagnostics.EventLog With {.Source = "MyService"} 
appLog.WriteEntry(message, EventLogEntryType.Error, transactionID) 

我也有我的app.config如下:

<system.diagnostics> 
    <sources> 
     <source name="MyService" switchName="DefaultSwitch"> 
     <listeners> 
      <!--<add name="FileLog"/>-->   
      <add name="EventLog"/> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="DefaultSwitch" value="Information" /> 
    </switches> 
    <sharedListeners> 
     <!--<add name="FileLog" 
      type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
      initializeData="FileLogWriter"/>-->  
     <add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="MyService"/> 
    </sharedListeners> 
    </system.diagnostics> 

我希望上面我的代碼應該工作,即使沒有設置的源屬性事件日誌編程,因爲我已經在配置文件中定義了源。但是如果我刪除With {.Source = "MyService"},那麼我得到一個異常,它表示在調用WriteEntry方法之前應該設置Source屬性。那麼,配置XML中的東西的目的是什麼?

回答

2

幸運的是,我偶然發現了一個答案,或者至少有一個答案,而在另一個應用程序上工作。當使用My.Application.Log對象時,配置文件中的設置很重要。例如:My.Application.Log.WriteEntry(errMsg)將根據app.config中的設置寫入文件或事件查看器。

因此,在這種情況下,EventLog類不會直接從代碼中調用。這爲我提供了額外的靈活性,可以將事件查看器中的日誌格式「熱切換」爲文件,例如,無需更改任何代碼或重新編譯。但我注意到的一件事是,<source>元素的Name屬性需要設置爲「DefaultSource」。否則,事件不會被記錄。可能有辦法改變這種情況,但我沒有看到需要,所以我沒有進一步調查。希望這對某些人有用。