0

我们有一个 ASP.NET 应用程序,它使用异常处理应用程序块将我们的异常记录到数据库(间接使用日志记录块)。这一切都很完美。然而,由于它使用异常处理块来记录数据,所以每次我们想要记录时,我们都必须新建一个 System.Exception 对象。由于我们没有抛出异常,因此没有性能问题。但是,每次我们想要记录一些东西时,我们都必须创建一个新的异常对象。这是一个糟糕的设计吗?

4

3 回答 3

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 异常类型处理的——只是一个示例,说明如何为不同的异常指定不同的处理程序。

当然,您可以添加一个日志文件侦听器,并在需要记录事件/操作时从代码中调用它,而不必依赖异常处理。如果您想了解更多详情,请告诉我。

于 2009-01-02T23:56:49.620 回答
0

由于您已经在使用日志记录应用程序块和 EL(即使它是间接的),您应该能够通过它登录到数据库,而不是仅仅为了记录目的而新建一个异常。

我也喜欢 ELMAH 用于异常处理。我将它用于未处理的异常日志记录,并将 log4net 用于所有其他日志记录。

于 2009-01-02T23:29:11.847 回答
0

我不会这么说的。它是一个异常处理块,而不是一个日志记录块。也许您应该改用 EL 的 LAB?

顺便说一句,我喜欢并使用 ELMAH 作为异常处理块。它也不是为记录而设计的,只是为了处理异常并将它们记录下来以供以后检查。但是,我认为有一种方法可以引发异常事件而无需新建 Exception 对象。

于 2009-01-02T23:03:53.940 回答