在应用程序配置文件</system.diagnostics>中正确使用<system.diagnostics>设置

时间:2010-10-15 20:46:59

标签: .net configuration windows-services event-log

我最近创建了一个Windows服务。忠实地做的一件事是将任何错误记录到应用程序日志中。我有以下代码执行此操作:

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>

我希望上面的代码即使没有以编程方式设置EventLog的Source属性也能正常工作,因为我已经在配置文件中定义了源代码。但是如果我删除With {.Source = "MyService"},那么我会得到一个Exception,它表示应该在调用WriteEntry方法之前设置Source属性。那么,配置XML中的东西的目的是什么?

1 个答案:

答案 0 :(得分:3)

幸运的是,我在一个不同的应用程序上偶然发现了一个答案,或者至少是一个部分答案。使用My.Application.Log对象时,配置文件中的设置很重要。例如:My.Application.Log.WriteEntry(errMsg)将根据app.config中的设置写入文件或事件查看器。

因此,在这种情况下,不会直接从代码中调用EventLog类。这使我具有额外的灵活性,可以将日志格式从事件查看器“热交换”到文件,例如,无需更改任何代码或重新编译。我注意到的一件事是<source>元素的Name属性需要设置为“DefaultSource”。否则,事件不会被记录。可能有一种方法可以改变它,但我没有看到需要,所以我没有进一步调查。希望这对某些人有用。