.net - 应用程序日志记录

标签 .net winforms logging

我有一个 WinForms 应用程序,我需要记录所有已处理和未处理的异常(到文件、Web 服务等)。我该怎么做?

最佳答案

.NET 世界中最常用的日志记录框架是 log4net。

在您的应用程序中集成 log4net 需要两个步骤:

  1. 配置 log4.net。例如,查看 log4net 配置示例页面上的 FileAppender。
  2. 准备您的类(class)以使用 log4net:

每个类都应该包含一个用于日志记录的字段:

private static ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

现在,每当您必须处理异常时,您将执行以下操作:

try
{
  // Do stuff here
}
catch (Exception ex)
{
  _logger.Error("Operation failed.", ex);
}

通过这种方式,您只解决了一半的问题:处理异常

为了捕获 Windows 窗体应用程序中所有未处理的异常,您必须处理 .NET 框架提供的 2 个事件:

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

    Application.ThreadException += Application_ThreadException;
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    _logger.Error("Unhandled exception.", (Exception)e.ExceptionObject);
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    _logger.Error("Unhandled application exception.", e.Exception);
}

就是这样。简单又好用!

当您开始向一个或多个客户交付应用程序时,事情就变得复杂了。这是因为您需要要求您的客户向您提供日志文件,以便检查应用程序是否遇到任何问题。

因此,你必须解决两个问题:

  1. 如何在您的应用程序出现问题时得到通知?
  2. 如何获取异常、环境等详细信息?

解决这两个问题的方法是使用一种专用服务,将所有异常集中在一个地方,并在您的应用程序遇到任何异常时通知您。


有几种服务试图解决所有这些问题,其中之一是 ExceptionTail .
ExceptionTail 的一个非常好的特性是它通过 custom log4net appender 与使用 log4.net 的现有应用程序无缝集成。 .
这意味着您不必为了使用该服务而重新编译整个应用程序。只需将一些 dll 放到应用程序的文件夹中,向应用程序配置文件中添加一些内容,就可以了。

关于.net - 应用程序日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5003654/

相关文章:

.net - 数据协定序列化可以与 BasicHttpBinding 一起使用吗?

c# winforms - 子窗体上的不可访问控件

c# - 如何通过两种不同类型的字段对 linq 查询结果进行排序

mysql - 从 SQL 查询到应用程序代码的回溯?

c# - 在应用程序中编写诊断类是否常见

.net - Umbraco是或否?

c# - 计算代码库中的匿名类?

c# - 通过调用另一个类的函数将数据传递到非静态列表框

logging - 如何从真实的 Windows Phone 8 设备访问日志输出

c# - SSRS 外部组件 : Failed to load expression host assembly