log4net记录来自不同项目的UnhandledException异常

时间:2015-02-18 02:17:48

标签: c# log4net log4net-configuration raygun.io raygun

我的解决方案中有几个项目,其中大部分是Windows服务。我为每个配置了log4net(为每个生成单独的日志文件),以及log4net的Raygun appender。我想为每个项目捕获UnhandledException,并获取它们的起源信息(在日志文件和raygun仪表板中),我想在一个地方为我的解决方案中的所有项目执行此操作。

因此,我创建了一个单独的静态类和方法来记录这些异常。

  • 如何记录异常,以便我的日志文件显示生成该错误的类而不是Logger静态类(以及让raygun.io仪表板显示异常的正确来源)=>

    Logger.UnhandledException [错误] - 现在这是错误的。它应该是发生例外的类名

  • 我会为此创建一个线程安全的单例吗?这甚至是正确的方法吗?

静态类:

public static class Logger
{
    private static readonly ILog Log = LogManager.GetLogger(Assembly.GetEntryAssembly().FullName);

    public static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Log.Error(e);
    }
}

Windows服务:

private static void Main(string[] args)
{

        Configure.Serialization.Xml();

        // Unhandled exceptions - subscribe to the event (I would do this to all my projects in the solution)
        AppDomain.CurrentDomain.UnhandledException += Logger.UnhandledException;
}

1 个答案:

答案 0 :(得分:2)

没有办法获取未处理异常发生位置的类名,除非在事件处理程序中使用堆栈上的反射,在发布版本中不能保证给你无论如何都是班级名称。

在具有正确错误处理的Windows服务中,未处理的异常应该是例外:将Main代码包装在try..catch子句中,并捕获异常,无论它们发生在何处服务代码。如果仍然发生未处理的异常,您至少会有一个堆栈跟踪可以使用,这将允许您识别异常的来源。