[英]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部分中,此文件定义
In the exceptionHandling section, it defines 在exceptionHandling部分中,它定义了
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}; 
 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 & 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.