将例外写入Windows日志文件

我想赶上我的exception,并将它们logging在Windows日志文件中。 我如何去打开和写入Windows日志?

Solutions Collecting From Web of "将例外写入Windows日志文件"

您可以使用System.Diagnostics.EventLog.WriteEntry函数将条目写入事件日志。

System.Diagnostics.EventLog.WriteEntry("MyEventSource", exception.StackTrace, System.Diagnostics.EventLogEntryType.Warning); 

要读取事件日志,您可以使用System.Diagnostics.EventLog.GetEventLogs函数。

 //here's how you get the event logs var eventLogs = System.Diagnostics.EventLog.GetEventLogs(); foreach(var eventLog in eventLogs) { //here's how you get the event log entries foreach(var logEntry in eventLog.Entries) { //do something with the entry } } 

您也可以考虑使用企业库 。 开始看起来很复杂,但是一两个小时的演奏就会获得回报。 Config存储在app.config中,所以你可以在不用重新编译的情况下改变它 – 当你有相同的代码坐在具有不同配置的测试和活动服务器上时,这可以非常方便。 你可以做很多没有代码的负载。

一件好事是您可以定义异常策略,以便自动记录异常。 以下是您可能会使用的一些代码(我正在使用EntLib 4.1):

  try { //This would be where your exception might be thrown. I'm doing it on //purpose so you can see it work throw new ArgumentNullException("param1"); } catch (Exception ex) { if (ExceptionPolicy.HandleException(ex, "ExPol1")) throw; } 

如果ExPol1定义它,catch块中的行会重新抛出异常。 如果ExPol1配置为重新抛出,则ExceptionPolicy.HandleException将返回true。 如果不是,则返回false。

你在配置中定义其余部分。 XML看起来非常糟糕(不是总是这样),而是使用Enterprise Library Configuration编辑器创建它。 我只是提供完整性。

在loggingConfiguration部分,这个文件定义

  • 日志:一个滚动的文本日志文件(你可以使用内置的Windows事件日志,SQL表,电子邮件,MSMQ等),与
  • 一个文本格式化程序,用于管理如何将参数写入日志(有时将其配置为将所有内容写入一行,其他时间则分布在多行中),
  • 一个单一的类别“一般”
  • 捕获config / entlib中的任何错误并报告它们的特殊源。 我强烈建议你这样做。

在exceptionHandling部分,它定义了

  • 一个策略:“ExPo1”,它处理ArgumentNullExceptions类型,并指定None的postHandlingAction(即不重新抛出)。
  • 记录到常规类别(以上定义)的处理程序

在这个例子中我不这样做,但是你也可以用一个策略来替换一个不同类型的异常。

  <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </configSections> <loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"> <listeners> <add fileName="rolling.log" footer="" formatter="Text Formatter" header="" rollFileExistsBehavior="Overwrite" rollInterval="None" rollSizeKB="500" timeStampPattern="yyyy-MM-dd" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTracelistnerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.Tracelistners.RollingFlatFileTracelistner, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="Rolling Flat File Trace listner" /> </listeners> <formatters> <add template="Timestamp: {timestamp}; Message: {message}; Category: {category}; Priority: {priority}; EventId: {eventid}; Severity: {severity}; Title:{title}; Machine: {machine}; Application Domain: {appDomain}; Process Id: {processId}; Process Name: {processName}; Win32 Thread Id: {win32ThreadId}; Thread Name: {threadName}; &#xD;&#xA; Extended Properties: {dictionary({key} - {value})}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="Text Formatter" /> </formatters> <categorySources> <add switchValue="All" name="General"> <listeners> <add name="Rolling Flat File Trace listner" /> </listeners> </add> </categorySources> <specialSources> <allEvents switchValue="All" name="All Events" /> <notProcessed switchValue="All" name="Unprocessed Category" /> <errors switchValue="All" name="Logging Errors &amp; Warnings"> <listeners> <add name="Rolling Flat File Trace listner" /> </listeners> </errors> </specialSources> </loggingConfiguration> <exceptionHandling> <exceptionPolicies> <add name="ExPol1"> <exceptionTypes> <add type="System.ArgumentNullException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" postHandlingAction="None" name="ArgumentNullException"> <exceptionHandlers> <add logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling" formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="0" useDefaultLogger="false" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="Logging Handler" /> </exceptionHandlers> </add> </exceptionTypes> </add> </exceptionPolicies> </exceptionHandling> </configuration> 

Windows使用事件日志来跟踪活动。 您可以使用System.Diagnostics.Trace类:

 var traceSwitch = new TraceSwitch("MySwitch", ""); var exception = new Exception("Exception message"); if (traceSwitch.TraceError) { Trace.TraceError(exception); } 

你可以使用app.config来指示记录器在哪里写:

 <system.diagnostics> <switches> <add name="MySwitch" value="Verbose" /> </switches> <trace autoflush="true"> <listeners> <add name="EventLogger" type="System.Diagnostics.EventLogTracelistner" initializeData="NameOfYourApplication" /> </listeners> </trace> </system.diagnostics> 

以下是写入事件日志的简单答案: http : //support.microsoft.com/kb/307024

更好的答案是使用像log4net ,这将为您处理。

这些文章解释了如何自动记录可能发生的未知异常:

VB.NET:http://visualbasic.about.com/od/usingvbnet/a/logging.htm

C#: 将项目转换为C#时将ApplicationEvents.vb的功能写入哪里