我们有一个 ASP.NET 应用程序,它使用异常处理应用程序块将我们的异常记录到数据库(间接使用日志记录块)。这一切都很完美。然而,由于它使用异常处理块来记录数据,所以每次我们想要记录时,我们都必须新建一个 System.Exception 对象。由于我们没有抛出异常,因此没有性能问题。但是,每次我们想要记录一些东西时,我们都必须创建一个新的异常对象。这是一个糟糕的设计吗?
3 回答
您可以独立于异常处理策略定义日志记录策略,它们不必一起使用。
异常处理和日志记录通过侦听器的链接多次一起使用。例如,您可以在 catch 块中捕获特定错误并引用您的异常处理策略,这也可能包括通过 logCategory 记录操作。
另一方面,要仅记录某些事件/操作,只需指定一个未从异常处理策略引用的日志跟踪侦听器。使用 Trace.Write 语句输出您的日志消息。
无论如何,如果您创建不同的策略,您可以在需要时链接侦听器以获得更大的灵活性。
更新: 在您的 loggingConfiguration 部分,配置另一个跟踪侦听器。然后,您需要在 web.config 的 categorySources 部分下添加侦听器。下面显示的是记录到两个源,事件日志和 xml 文件。
<categorySources>
<add switchValue="All" name="Database Events">
<listeners>
<add name="Formatted EventLog TraceListener"/>
<add name="XML TraceListener"/>
</listeners>
</add></categorySources>
在您的 exceptionHandling 部分下,确保将“数据库事件”categorySource 连接到您的策略:(为了便于阅读,省略了一些细节)
<exceptionHandling>
<exceptionPolicies>
<add name="Data Access Policy">
<exceptionTypes>
<add type="System.OverflowException, mscorlib, ... postHandlingAction="NotifyRethrow" name="OverflowException">
<exceptionHandlers>
<add logCategory="Database Events" eventId="100" ... severity="Critical" name="Logging Handler"/>
<add exceptionMessage="Overflow Exception caught." ... >
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies></exceptionHandling>
因此,这种情况下的最终结果是链接从单个策略引用的两个侦听器。请注意,它是从 system.overflow 异常类型处理的——只是一个示例,说明如何为不同的异常指定不同的处理程序。
当然,您可以添加一个日志文件侦听器,并在需要记录事件/操作时从代码中调用它,而不必依赖异常处理。如果您想了解更多详情,请告诉我。
由于您已经在使用日志记录应用程序块和 EL(即使它是间接的),您应该能够通过它登录到数据库,而不是仅仅为了记录目的而新建一个异常。
我也喜欢 ELMAH 用于异常处理。我将它用于未处理的异常日志记录,并将 log4net 用于所有其他日志记录。
我不会这么说的。它是一个异常处理块,而不是一个日志记录块。也许您应该改用 EL 的 LAB?
顺便说一句,我喜欢并使用 ELMAH 作为异常处理块。它也不是为记录而设计的,只是为了处理异常并将它们记录下来以供以后检查。但是,我认为有一种方法可以引发异常事件而无需新建 Exception 对象。