2012-12-15 35 views
11

有没有办法配置NLog自动记录我的应用程序可以发送的所有异常?目前,我正在尝试所有TRY/CATCH块,并在CATCH中手动添加日志记录 - 但如果我错过了某些内容,该怎么办?而如果将来有人做什么NLog配置为自动记录所有异常?

有没有办法告诉NLog总是记录所有异常?尤其是有些没有被捕获并可能导致弹出?

回答

15

据我所知,没有办法confineNLog记录所有异常。

如果您只想记录未处理的异常,则可以在初始化应用程序时向AppDomain添加“UnhandledException Handler”。 请注意,在某些情况下,可能无法记录错误(例如出现OutOfMemory异常或可怕的情况)。

注意,AppDomain中也有一个FirstChanceException事件,您可以订阅,但是这将意味着你收到通知每个异常发生(可能由用户代码来处理) - 在这个有很多。

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException); 

static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // use logger here to log the events exception object 
    // before the application quits 
} 

注意,这样只会让你的日志会导致应用程序崩溃的例外 - 你不能阻止它崩溃(所以名称:未处理的异常)。

另一种选择是使用面向方面编程(AOP) - 并在每次方法调用后引入一个日志记录方面,以防出现错误。如果您的应用程序使用分层架构,这可能相对容易(例如,将方面添加到您的业务逻辑层的所有调用中...)。

你可能会发现像PostSharpSpring.Net框架有用(通常他们的网站提供了一些简单的例子)。

+0

这是什么的AppDomain的范围是什么?它会在我的项目中捕获所有未处理的异常还是仅捕获每个类?另外,我也参考了一些DLL,那些异常呢?我是否需要将此代码添加到每个DLL(这是他们自己的项目)? – JSchwartz

+1

Appdomain是一个.net概念,用于为应用程序定义一个独立的边界。如果您创建一个控制台应用程序,它将在一个AppDomain中执行。所有必需的程序集也将加载到相同的AppDomain中。如果在你的应用程序中发生了什么(无论在什么程序集中),它将发生在同一个appdomain中。通常,只在应用程序的开始处(例如,在应用程序的Main方法中,或者在application_start方法中的global.asax中存在WebApp的情况下)将示例代码放置一次。请参阅http://msdn.microsoft.com/en-us/library/system.appdomain.aspx –

0

对于的WebAPI应用程序,你可以做到这一点在Global.asax.cs

protected void Application_Error() 
{ 
    Exception lastException = Server.GetLastError(); 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Fatal(lastException); 
} 

MSDN resource