【问题标题】:NLog configured to automatically log all exceptions?NLog 配置为自动记录所有异常?
【发布时间】:2012-12-15 20:30:22
【问题描述】:

有没有办法将 NLog 配置为自动记录我的应用程序可以发送的所有异常?目前,我将访问所有 TRY/CATCH 块并在 CATCH 中手动添加日志记录 - 但如果我错过了一些怎么办?如果将来有人这样做怎么办

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

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    据我所知,没有办法限制 NLog 记录所有异常。

    如果您只想记录未处理的异常,您可以在初始化应用程序时将“UnhandledException Handler”添加到 AppDomain。 请注意,在某些情况下,可能无法记录错误(例如,在 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) - 并在每次方法调用后引入日志方面,以防出现错误。如果您的应用程序使用分层架构,这可能相对容易做到(例如,将 aspect 添加到业务逻辑层的所有调用中......)。

    您可能会发现像 PostSharpSpring.Net 这样的框架很有用(通常他们的网站为此提供了一些简单的示例)。

    【讨论】:

    • 这个AppDomain的范围是什么?它会在我的项目中捕获所有未处理的异常还是仅在每个班级中捕获?我还引用了一些 DLL,那些异常呢?我是否需要将此代码添加到每个 DLL(它们是他们自己的项目)中?
    • Appdomain 是一个 .net 概念,用于定义应用程序的隔离边界。如果您创建一个控制台应用程序,它将在一个 AppDomain 中执行。所有必需的程序集也将加载到同一个 AppDomain 中。如果您的应用程序中发生了某些事情(无论在哪个程序集中),它将发生在同一个 appdomain 中。通常,您只在应用程序的开头放置一次示例代码(例如,在应用程序的 Main 方法中,或者在 application_start 方法中的 global.asax 中的 WebApp 的情况下)。见msdn.microsoft.com/en-us/library/system.appdomain.aspx
    【解决方案2】:

    对于 WebApi 应用程序,您可以像这样在 Global.asax.cs 中执行此操作

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

    MSDN resource

    【讨论】:

      【解决方案3】:

      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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        相关资源
        最近更新 更多