Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NLog是否配置为自动记录所有异常?_C#_Nlog - Fatal编程技术网

C# NLog是否配置为自动记录所有异常?

C# NLog是否配置为自动记录所有异常?,c#,nlog,C#,Nlog,有没有办法将NLog配置为自动记录我的应用程序可以发送的所有异常?目前,我将使用所有TRY/CATCH块,并在CATCH中手动添加日志记录-但是如果我错过了一些怎么办?如果将来有人这样做呢 有没有办法告诉NLog始终记录所有异常?特别是一些未被捕获并可能导致弹出的?据我所知,无法将NLOG限制为记录所有异常 如果您只想记录未处理的异常,则可以在初始化应用程序时向AppDomain添加“未处理的异常处理程序”。 请注意,在某些情况下,可能无法记录错误(例如,在OutOfMemory异常或其他可怕的

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


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

据我所知,无法将NLOG限制为记录所有异常

如果您只想记录未处理的异常,则可以在初始化应用程序时向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
}
请注意,这只允许您记录导致应用程序崩溃的异常-您无法防止它崩溃(因此名称为:unhandled exception)

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


您可能会发现类似或有用的框架(通常他们的网站提供了一些简单的例子)。

对于WebApi应用程序,您可以在
Global.asax.cs
中这样做

受保护的无效应用程序\u错误()
{
Exception lastException=Server.GetLastError();
NLog.Logger Logger=NLog.LogManager.GetCurrentClassLogger();
logger.Fatal(上次异常);
}

雅切克的答案对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);
    }

此AppDomain的范围是什么?它将捕获项目中所有未处理的异常还是仅捕获每个类?我还引用了一些DLL,那么这些DLL的异常情况如何呢?是否需要将此代码添加到每个DLL(它们自己的项目)?Appdomain是一个.net概念,用于定义应用程序的隔离边界。如果创建控制台应用程序,它将在一个AppDomain中执行。所有必需的程序集也将加载到同一AppDomain中。如果应用程序中发生了某些事情(无论在哪个程序集中),它都将发生在同一appdomain中。通常,您只在应用程序的开头放置一次示例代码(例如,在应用程序的主方法中,或者在应用程序的启动方法中,如果是全局.asax中的WebApp)。看见