我最近创建了一个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中的东西的目的是什么?
答案 0 :(得分:3)
幸运的是,我在一个不同的应用程序上偶然发现了一个答案,或者至少是一个部分答案。使用My.Application.Log
对象时,配置文件中的设置很重要。例如:My.Application.Log.WriteEntry(errMsg)
将根据app.config中的设置写入文件或事件查看器。
因此,在这种情况下,不会直接从代码中调用EventLog
类。这使我具有额外的灵活性,可以将日志格式从事件查看器“热交换”到文件,例如,无需更改任何代码或重新编译。我注意到的一件事是<source>
元素的Name属性需要设置为“DefaultSource”。否则,事件不会被记录。可能有一种方法可以改变它,但我没有看到需要,所以我没有进一步调查。希望这对某些人有用。