还在到处加异常日志记录?试试全局异常统一处理吧(包含.net core、WPF、Console实现方法)。

作者:微信公众号:【架构师老卢】
11-13 9:43
314

概述:在.NET应用程序中,使用log4net来记录日志并实现全局异常处理是一种常见的做法。log4net是一个强大的日志记录框架,可以帮助您捕获应用程序中的异常信息并将其记录到不同的目标(如文件、数据库、控制台等)

在.NET应用程序中,使用log4net来记录日志并实现全局异常处理是一种常见的做法。log4net是一个强大的日志记录框架,可以帮助您捕获应用程序中的异常信息并将其记录到不同的目标(如文件、数据库、控制台等)。下面我将分别为.NET Core、WPF和Console应用程序提供全局异常处理的示例,使用log4net来记录异常日志。

1. .NET Core 应用程序

.NET Core 全局异常处理方法

在.NET Core应用程序中,可以通过订阅AppDomain.CurrentDomain.UnhandledException事件和AppDomain.CurrentDomain.ProcessExit事件来实现全局异常处理。log4net将用于记录异常信息。

首先,确保您已经安装了log4net包,可以使用NuGet Package Manager来安装。

dotnet add package log4net

然后,创建一个log4net配置文件,例如log4net.config,以配置日志记录器的目标(例如,将日志记录到文件):

<log4net>
  <root>
    <level value="ERROR" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
    <file value="log.txt" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>

接下来,创建一个.NET Core控制台应用程序,并添加log4net的配置。

using System;
using System.IO;
using log4net;
using log4net.Config;

namespace GlobalExceptionHandlingCore
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            // 配置log4net
            var log4netConfig = new FileInfo("log4net.config");
            XmlConfigurator.Configure(log4netConfig);

            AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;

            // 模拟一个引发异常的操作
            int result = 1 / 0;

            Console.WriteLine("应用程序继续执行...");
        }

        static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
        {
            log.Error("发生未处理的异常", (Exception)e.ExceptionObject);
            // 在此可以记录异常、通知开发人员或采取适当的措施
        }
    }
}

在这个示例中,我们首先配置log4net,然后订阅AppDomain.CurrentDomain.UnhandledException事件以捕获未处理的异常并记录它们。

2. WPF (Windows Presentation Foundation) 应用程序

WPF 全局异常处理方法

在WPF应用程序中,我们可以使用Application.DispatcherUnhandledException事件来实现全局异常处理,同样使用log4net来记录异常信息。

首先,确保您在WPF项目中安装了log4net包,可以使用NuGet Package Manager来安装。

Install-Package log4net

然后,创建一个log4net配置文件,如前所述。

接下来,创建一个WPF应用程序并在App.xaml.cs中添加全局异常处理。

using System;
using System.IO;
using System.Windows;
using log4net;
using log4net.Config;

namespace GlobalExceptionHandlingWPF
{
    public partial class App : Application
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(App));

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // 配置log4net
            var log4netConfig = new FileInfo("log4net.config");
            XmlConfigurator.Configure(log4netConfig);

            AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
            Application.Current.DispatcherUnhandledException += DispatcherUnhandledExceptionTrapper;

            // 模拟一个引发异常的操作
            int result = 1 / 0;
        }

        static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
        {
            log.Error("发生未处理的异常", (Exception)e.ExceptionObject);
            // 在此可以记录异常、通知开发人员或采取适当的措施
        }

        static void DispatcherUnhandledExceptionTrapper(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            log.Error("发生未处理的异常", e.Exception);
            // 在此可以记录异常、通知开发人员或采取适当的措施
            e.Handled = true; // 阻止应用程序崩溃
        }
    }
}

在这个示例中,我们在WPF应用程序的App类中重写OnStartup方法,配置log4net并订阅AppDomain.CurrentDomain.UnhandledException和Application.Current.DispatcherUnhandledException事件以捕获和记录异常。

3. 控制台应用程序

控制台应用程序全局异常处理方法

在控制台应用程序中,我们使用相同的方式来处理全局异常,使用AppDomain.CurrentDomain.UnhandledException事件和log4net来记录异常信息。

首先,确保您已经安装了log4net

包,可以使用NuGet Package Manager来安装。

dotnet add package log4net

然后,创建一个log4net配置文件,如前所述。

接下来,创建一个.NET Core控制台应用程序并添加log4net的配置。

using System;
using System.IO;
using log4net;
using log4net.Config;

namespace GlobalExceptionHandlingConsole
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            // 配置log4net
            var log4netConfig = new FileInfo("log4net.config");
            XmlConfigurator.Configure(log4netConfig);

            AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;

            // 模拟一个引发异常的操作
            int result = 1 / 0;

            Console.WriteLine("应用程序继续执行...");
        }

        static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
        {
            log.Error("发生未处理的异常", (Exception)e.ExceptionObject);
            // 在此可以记录异常、通知开发人员或采取适当的措施
        }
    }
}

在这个示例中,我们首先配置log4net,然后订阅AppDomain.CurrentDomain.UnhandledException事件以捕获未处理的异常并记录它们。

使用log4net和AppDomain事件来实现全局异常处理是.NET应用程序中的一种常见做法。这允许您捕获应用程序中的异常并将其记录到日志文件中,从而更容易排查问题和监视应用程序的健康状况。无论是.NET Core、WPF还是控制台应用程序,您都可以采用类似的方法来实现全局异常处理和日志记录。

阅读排行