2015-02-18 11 views
2

У меня есть несколько проектов в моем решении, большинство из которых - службы Windows. У меня есть log4net, настроенный для каждого (создание отдельного файла журнала для каждого), а также приложение Raygun для log4net. Я хотел бы поймать UnhandledException для каждого из этих проектов и получить информацию о том, откуда они появились (как в файле журнала, так и в панели управления Raygun), и я хотел бы сделать это в одном месте для всех проектов в моем решении.log4net logging UnhandledException исключения из разных проектов

Таким образом, я создал отдельный статический класс и метод, которые регистрировали бы эти исключения.

  • Как я могу войти исключение, чтобы мой файл журнала будет показывать класс, создавший эту ошибку, а не статический класс Logger (а также иметь raygun.io панель показать правильное происхождение, за исключением) =>

    Logger.UnhandledException [ERROR] - это уже неправильно. это должно быть имя класса, в котором возникло исключение

  • Могу ли я создать потокобезопасный синглтон для этого? Это даже правильный подход?

Статический класс: сервис

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); 
    } 
} 

Окна:

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; 
} 

ответ

2

Там нет никакого способа, чтобы получить имя класса для того, где произошло необработанное исключение, за исключением, возможно, с помощью отражения в стеке в обработчике событий, который в версии сборки не гарантирует, что вы дадите имя класса в любом случае.

Необработанные исключения должны быть исключительную в службе Windows, с правильной обработкой ошибок: обернуть Main код в пункте try..catch и перехватывать исключения там, где они могут произойти в коде сервиса. Если все необработанные исключения по-прежнему происходят, по крайней мере у вас будет трассировка стека, которая позволит вам определить, откуда исходило исключение.

 Смежные вопросы

  • Нет связанных вопросов^_^