NLog配置自动记录所有异常?

15

有没有一种方法可以配置NLog自动记录应用程序可能发送的所有异常?目前,我正在进入所有TRY/CATCH块并在CATCH中手动添加日志记录 - 但如果我错过了一些呢?如果将来有其他人做了同样的事情怎么办?

有没有一种方法告诉NLog始终记录所有异常?特别是一些未被捕获且可能导致弹出窗口的异常?

3个回答

17
据我所知,没有一种方法可以限制 NLog 记录所有异常。如果你只想记录未处理的异常,可以在初始化应用程序时向 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这样的框架很有用(通常它们的网站提供一些易于使用的示例)。

这个AppDomain的范围是什么?它会捕获我项目中的所有未处理异常还是只针对每个类?另外,我引用了一些DLL,那么这些DLL中的异常怎么办?我需要将此代码添加到每个DLL中吗(它们是自己的项目)? - JSchwartz
1
AppDomain是一个.NET概念,用于定义应用程序的隔离边界。如果您创建控制台应用程序,则将在一个AppDomain中执行它。所有所需的程序集也将在同一个AppDomain中加载。如果应用程序中发生了什么事情(无论在哪个程序集中),它都会发生在同一个appdomain中。通常,您只需要在应用程序开头的示例代码中放置一次(例如,在应用程序的Main方法中,或者在WebApp的global.asax中的application_start方法中)。请参阅http://msdn.microsoft.com/en-us/library/system.appdomain.aspx - Bernhard Kircher

3
对于 WebApi 应用程序,您可以在 Global.asax.cs 中这样做。
protected void Application_Error()
{
    Exception lastException = Server.GetLastError();
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    logger.Fatal(lastException);
}

MSDN resource


-1
Jacek的回答适用于WebApi。 这里是控制台应用程序的答案:
    private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException);
        Object o = SomeMethodToThrowError(); // Cause an exception
    }

    static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // use logger here to log the events exception object
        // before the application quits
        Exception ex = (Exception)e.ExceptionObject;
        Logger.Error(ex.Message + " " + ex.StackTrace);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接