log4net logging Исключения UnhandledException из разных проектов

У меня есть несколько проектов в моем решении, большинство из которых - службы Windows. Я настроил log4net для каждого (генерируя отдельный файл журнала для каждого), а также приложение Raygun для log4net. Я хотел бы поймать 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 ответ

Решение

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

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

Другие вопросы по тегам