2011-02-15 125 views
2

我有一个WinForms应用程序,我需要记录所有异常(到文件,到web服务,无论),处理和未处理。我怎样才能做到这一点?应用程序日志

回答

8

在.NET世界上最常用的日志框架是log4net的。

但是也有一些需要log4net的在应用程序中集成两个步骤:

  1. 配置log4.net。例如,在log4net Config Examples页面上检出FileAppender。
  2. 准备你的类使用log4net的:

每个类应包含用于记录的字段:

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

现在,每当你将不得不处理异常,你会做以下:

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

这样你只解决了问题的一半:处理的异常

为了捕获所有未处理的异常在Windows窗体应用程序,你必须处理由.NET Framework提供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); 
} 

这all.Nice和容易!

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

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

  1. 如何当一些错误发生在您的应用程序得到通知?
  2. 如何获取有关异常,环境等的详细信息?

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


有几种服务试图解决所有这些问题,其中之一是ExceptionTail
ExceptionTail的一个非常不错的功能是它可以通过custom log4net appender与使用log4.net的现有应用程序无缝集成。
这意味着您无需重新编译整个应用程序即可使用该服务。只需在应用程序的文件夹中放入一些dll文件,在应用程序配置文件中添加一些东西,就可以开始使用了。

+1

这是一个很好的答案,我也建议使用Log4Net,但我会用自定义Logging类将调用包装到ILog对象中,以防万一以后日志引擎改变时,一个地方要更新,所有使用包装类的类都可以。 – 2011-07-03 12:31:59