简体   繁体   English

将异常写入Windows日志文件

[英]Writing Exceptions to the Windows Log File

I'd like to catch my exceptions and log them in the Windows log file. 我想捕获我的异常并将其记录在Windows日志文件中。 How do I go about opening and writing to the Windows log? 如何打开和写入Windows日志?

You can use the System.Diagnostics.EventLog.WriteEntry function to write entries to the event log. 您可以使用System.Diagnostics.EventLog.WriteEntry函数将条目写入事件日志。

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

To read event logs you can use the System.Diagnostics.EventLog.GetEventLogs function. 要读取事件日志,可以使用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
    }    
}

You can also consider using the Enterprise Library . 您也可以考虑使用企业库 It looks complicated to start with but an hour or two of playing will pay off. 开始时看起来很复杂,但是一两个小时的演奏会有所回报。 Config is stored in app.config so you can change it without recompiling - this can be really handy when you've got the same code sitting on test and live servers with different config. Config存储在app.config中,因此您无需重新编译即可对其进行更改-当您将相同的代码放在具有不同配置的测试服务器和实时服务器上时,这非常方便。 You can do quite a lot without loads of code. 在没有大量代码的情况下,您可以做很多事情。

One nice thing is that you can define Exception policies so that exceptions are automatically logged. 一件好事是您可以定义例外策略,以便自动记录例外。 Here's some code you might use (I'm using EntLib 4.1): 这是您可能会使用的一些代码(我正在使用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;
    }

The line in the catch block will rethrow the exception IF the ExPol1 defines it. 如果ExPol1定义了该异常,则catch块中的行将重新引发异常。 If ExPol1 is configured for rethrow, then ExceptionPolicy.HandleException will return true. 如果将ExPol1配置为重新抛出,则ExceptionPolicy.HandleException将返回true。 If not, it returns false. 如果不是,则返回false。

You define the rest in config. 您在配置中定义其余部分。 The XML looks pretty horrible (doesn't it always) but you create this using the Enterprise Library Configuration editor. XML看起来很可怕(并非总是如此),但是您可以使用企业库配置编辑器创建XML。 I'm just supplying it for completeness. 我只是为了完整性而提供它。

In the loggingConfiguration section, this file defines 在loggingConfiguration部分中,此文件定义

  • the log: a rolling text log file (you can use the built in windows event logs, sql tables, email, msmq and others), with 日志:滚动文本日志文件(您可以使用内置的Windows事件日志,sql表,电子邮件,msmq等)
  • a text formatter that governs how the parameters are written to the log (sometimes I configure this to write everything to one line, other times spread across many), 一个文本格式化程序,用于控制如何将参数写入日志(有时我将其配置为将所有内容写入一行,而其他时间分散在许多行中),
  • a single category "General" 单一类别“常规”
  • a Special Source which traps any errors in the config/entlib and reports them as well. 一个特殊源,可捕获config / entlib中的任何错误并报告它们。 I strongly advise you to do this. 我强烈建议您这样做。

In the exceptionHandling section, it defines 在exceptionHandling部分中,它定义了

  • a single policy: "ExPo1", which handles type ArgumentNullExceptions and specifies the postHandlingAction of None (ie don't rethrow). 单个策略:“ ExPo1”,该策略处理ArgumentNullExceptions类型并指定None的postHandlingAction(即不重新抛出)。
  • a handler which logs to the General category (defined above) 登录到“常规”类别(上面定义)的处理程序

I don't do it in this example, but you can also replace an exception with a different type using a policy. 在本示例中,我没有这样做,但是您也可以使用策略将异常替换为其他类型。

   <?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.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            name="Rolling Flat File Trace Listener" />
        </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 Listener" />
            </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 Listener" />
            </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 uses the Event log to trace activity. Windows使用事件日志来跟踪活动。 You can use the System.Diagnostics.Trace class: 您可以使用System.Diagnostics.Trace类:

var traceSwitch = new TraceSwitch("MySwitch", "");
var exception = new Exception("Exception message");

if (traceSwitch.TraceError)
{
    Trace.TraceError(exception);
}

And you can use app.config to instruct the logger where to write: 您可以使用app.config指示记录器在哪里写:

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

Here's the simple answer on writing to the event log: http://support.microsoft.com/kb/307024 这是写入事件日志的简单答案: http : //support.microsoft.com/kb/307024

A better answer is to use something like log4net , which will handle that for you. 更好的答案是使用log4net之类的东西,它将为您处理。

These articles explain how to automatically log unhanded exceptions that might occur: 这些文章解释了如何自动记录可能发生的未处理异常:

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

C#: Where to write the functions of ApplicationEvents.vb when converting project to C# C#: 将项目转换为C#时在哪里编写ApplicationEvents.vb函数

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM