我们有一个ASP.NET应用程序,它使用异常处理应用程序块将我们的异常记录到数据库(间接使用日志记录块)。这一切都很完美。但是,由于它使用异常处理块来记录数据,因此每次我们想要记录时,我们都必须新建一个System.Exception对象。由于我们没有抛出异常,因此没有性能问题。但是,每次我们要记录某些内容时,我们都必须创建一个新的异常对象。这是一个糟糕的设计吗?
答案 0 :(得分:3)
您可以独立于异常处理策略定义日志记录策略,它们不必一起使用。
异常处理和日志记录通过链接监听器一起使用多次。例如,您可以捕获catch块中的特定错误并引用您的异常处理策略,该策略还可以包括通过logCategory记录操作。
另一方面,要仅执行某些事件/操作的日志记录,只需指定未从异常处理策略引用的日志跟踪侦听器。使用Trace.Write语句输出日志消息。
无论如何,如果您创建不同的策略,您可以在需要时链接侦听器以获得更大的灵活性。
<强>更新强> 在loggingConfiguration部分中,配置另一个Trace Listener。然后,您需要在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>
<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异常类型处理的 - 只是一个示例,说明如何为不同的异常指定不同的处理程序。
当然,您只需添加日志文件侦听器,并在需要记录事件/操作时从代码中调用它,而不必依赖异常处理。如果您想了解更多细节,请告诉我。
答案 1 :(得分:0)
我不会这么说。它是一个异常处理块,而不是一个日志块。也许您应该使用EL的LAB?
顺便说一下,我喜欢并使用ELMAH作为异常处理块。它也不是专为日志记录而设计的,只是为了处理异常并将其记录下来以供日后检查。我认为有一种方法可以在不增加异常对象的情况下引发异常事件。
答案 2 :(得分:0)
由于您已经在使用日志应用程序块和EL(即使它是间接的),您应该只能通过它登录数据库,而不是仅为了记录目的而新建一个例外。
我也非常喜欢ELMAH进行异常处理。我将其用于未处理的异常日志记录,将log4net用于所有其他日志记录。