NLog настроен для автоматического регистрации всех исключений?

Есть ли способ настроить NLog для автоматического регистрации всех исключений, которые может отправить мое приложение? В настоящее время я перехожу ко всем блокам TRY/CATCH и вручную добавляет запись в CATCH, но что, если я пропущу некоторые? И что, если в будущем кто-то еще сделает

Есть ли способ сказать NLog, чтобы всегда регистрировать все исключения? Особенно некоторые из них не пойманы и могут вызвать всплывающее окно?

Ответ 1

Насколько я знаю, нет способа ограничитьNLog для регистрации всех исключений.

Если вы хотите только зарегистрировать необработанные исключения, вы можете добавить "UnhandledException Handler" в AppDomain при инициализации своего приложения. Обратите внимание, что при некоторых обстоятельствах может быть невозможно зарегистрировать ошибку (например, в случае исключения OutOfMemory или что-то ужасное).

Обратите внимание, что AppDomain также имеет событие FirstChanceException, которое вы можете подписаться, но это будет означать, что вы получите уведомление обо всех возникающих исключениях (и может обрабатываться кодом пользователя) - в этом много.

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException);

static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // use logger here to log the events exception object
    // before the application quits
}

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

Другим вариантом было бы использовать Аспектно-ориентированное программирование (AOP) - и вводить аспект ведения журнала после каждого вызова метода в случае ошибки. Если ваше приложение использует многоуровневую архитектуру, это может быть относительно легко сделать (например, добавить аспект ко всем вызовам уровня вашей бизнес-логики...).

Вы можете найти фреймворк, например PostSharp или Spring.Net полезно (обычно их веб-сайты предоставляют для этого несколько простых примеров).

Ответ 2

Для приложения WebApi вы можете сделать это в Global.asax.cs как

protected void Application_Error()
{
    Exception lastException = Server.GetLastError();
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    logger.Fatal(lastException);
}

Ресурс MSDN