异常处理和日志记录应用程序块:企业库 1.0






3.66/5 (34投票s)
本文说明如何使用 .NET Framework 的企业库将异常记录到 trace.log 文件中。
引言
在这里,我将讨论企业库 1.0 的异常应用程序块的实现,因为我已经查阅了各种网站,但发现没有关于该主题的教程或文章。有时可能会发生这种情况,我们有很多包含许多层的模块。在这种情况下,如果引发了任何异常,我们可能无法确定异常是从哪个 aspx 页面、哪个模块或哪个层发生的。所以这里有一个解决方案,您可以将异常记录到 trace.log 文件中,这是一个文本文件。此日志文件提供异常的详细信息。我们也可以将此日志记录到数据库中。我将在下一篇文章中介绍这一点。那么,我们开始吧。
必备组件
安装企业库 1.0。
分步实现
- 使用 Microsoft Visual Studio .NET,创建一个名为 'ExceptionConfigurationBlock' 的 C# ASP.NET Web 应用程序项目。
- 从解决方案资源管理器窗口向项目添加引用。在解决方案资源管理器中右键单击项目,单击“添加引用”,然后浏览路径 c/Program File/Microsoft Enterprise Library/bin。选择 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll、Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll,然后单击“确定”。
- 现在,在 webform 'ExceptionapplicationBlock.aspx.cs' 中包含这些引用
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling; using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging;
- 这是一个重要步骤。在您的系统上安装企业库后,转到“程序”菜单,单击“Microsoft Patterns and Practices”,您将找到“Enterprise library”。在其下打开“Enterprise Library Configuration”。
- 打开企业库配置后,单击“文件”菜单,选择“打开应用程序”。现在您将看到文件浏览器窗口。通过路径 inetpub/wwwroot/Exception Configuration Block 浏览您的应用程序,选择 Web.config 文件,然后单击“确定”。
- 右键单击“应用程序”菜单,选择“新建”,然后单击“异常处理应用程序块”。执行此操作后,将出现异常处理应用程序块的子节点菜单部分。
- 右键单击“异常处理应用程序块”,选择“新建”,然后单击“异常策略”。完成此操作后,您会发现“异常策略”出现了。通过双击“异常策略”将其重命名为“业务层策略”。
注意:异常策略是一种对异常进行分类的方法。一个异常策略下可以有许多异常类型。
- 右键单击“业务层策略”,选择“新建”,然后单击“异常类型”。会出现一个对话框,其中显示了异常列表。在 System 下选择“Exception”。单击“确定”按钮。参见下图。
- 右键单击“Exception”,选择“新建”,然后单击“日志记录处理程序”。
- 在右侧更改日志记录处理程序的设置。将
LogCategory=trace
,参见图。 - 现在单击“客户端设置”,在右侧查看“Attributes”部分,将“
TracingEnabled=true
”设置为 true。 - 单击“分布式设置”,查看属性设置,将
DefaultCategory=trace
设置为 trace。参见下图。注意:此设置可将异常跟踪到 Trace.log 文件。
- 文件名(Trace.log)的设置:可以通过在“Trace”的“Flat File Destination”节点菜单中指定其路径来更改文件名及其路径,该菜单在“分布式设置”下列出。参见下图。
- 保存文件。
- 保存企业配置后,在解决方案资源管理器窗口中转到 ASP.NET Web 项目,选择“所有文件”图标并包含所有配置文件。
一切设置完毕。基本上,我们已经为异常环境设置了配置,例如异常类型、异常类别、异常日志记录及其各种参数。
现在,应用程序的有趣部分是将此异常层调用到应用程序层。这是代码隐藏部分……
代码后置
创建一个按钮,我在上面引发了“除零异常”
public void btnException_Click(object sender, System.EventArgs e)
{
try
{
int i=5;
int j=0;
int z=i/j;
}
catch(Exception ex)
{
bool rethrow =
ExceptionPolicy.HandleException(ex, "Business Layer Policy");
if (rethrow)
{
throw;
}
}
finally
{
//Code ---
}
}
}
关键场景
如果所需输出如图中所示,那么异常将记录在 Trace.log 文件中以及页面上。这是因为设置了 PostHandling=NotifyRethrow
。如果设置了 PostHandling=NotifyRethrow
,那么我们可以将异常重新抛出到 aspx 页面以及 Trace.log 文件或任何数据库。如果设置了 PostHandling=None
,那么我们不能将异常重新抛出到 aspx 页面,但可以跳过在 'LogCategory=general
' 中的日志记录,或者以 LogCategory=trace
模式记录异常。
- '
LogCategory=general
' 不记录异常。 - '
LogCategory=Trace
' 将异常记录到日志文件或数据库等。
重要提示:如果存在“Security”异常且未记录任何日志,则右键单击 inetpub/wwwroot/ExceptionconfigurationBlock 中的项目文件夹,选择“Security”并授予完全权限。
生成的输出文件 Trace.log 文件内容
----------------------------------------
Timestamp: 4/25/2005 2:15:48 PM
Message: HandlingInstanceID: 3030db61-cccb-4b0b-8a3a-3661df5924db
An exception of type 'System.DivideByZeroException' occurred and was caught.
----------------------------------------------------------------------------
04/25/2005 14:15:48
Type : System.DivideByZeroException, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Attempted to divide by zero.
Source : ExceptionConfiguration block
Help link :
TargetSite : Void btnException_Click(System.Object, System.EventArgs)
Stack Trace :
at ExceptionConfiguration_block.WebForm1.btnException_Click(Object sender,
EventArgs e) in c:\inetpub\wwwroot\exceptionconfiguration
block\exceptionapplicationblock.aspx.cs:line 55
Additional Info:
MachineName : ITL232
TimeStamp : 4/25/2005 8:45:48 AM
FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
AppDomainName :
/LM/w3svc/1/root/ExceptionConfiguration block-10-127588725471560100
ThreadIdentity :
WindowsIdentity : ITL232\ASPNET
Category: Trace
Priority: 0
EventId: 100
Severity: Error
Title:Enterprise Library Exception Handling
Machine: ITL232
Application Domain:
/LM/w3svc/1/root/ExceptionConfiguration block-10-127588725471560100
Process Id: 1924
Process Name: C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_wp.exe
Win32 Thread Id: 1932
Thread Name:
Extended Properties:
----------------------------------------
所以这里您可以看到实际的魔术在运行。
历史
我已经写了一篇关于企业库 1.0 的配置应用程序块的文章。
结论
我的目标是让学习者了解这项出色的技术。人们可以利用这些层,使事情变得更容易和结构化。您的建议、批评、意见都非常受欢迎。请告诉我您觉得这篇文章是否有帮助。