Почему NLog создает дубликаты сообщений об ошибках? - PullRequest
0 голосов
/ 31 января 2019

NLog настроен для отправки мне писем со всеми сообщениями об ошибках, которые появляются в моем приложении.Это делает свою работу, но я иногда получаю более десятка дубликатов электронных писем, сообщающих мне о стандартном поведении приложения (например, «Пользователь обновил список» будет происходить один раз в приложении и базе данных, но я получу уведомление более 12 раз)

Я не могу найти рифму или причину того, почему некоторые сообщения спамят мою папку «Входящие», в то время как другие ведут себя так, как ожидалось.Я замечаю это на всех уровнях регистрации и с различным количеством повторяющихся сообщений об ошибках.

public static void Main(string[] args){    
    var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
        try
        {
            logger.Info("ProducersPortal.Web Started.");
            BuildWebHost(args).Run();
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Error(ex, "Stopped program because of exception");
            throw;
        }
        finally
        {
            logger.Info("ProducersPortal.Web Stopped.");
            // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
            NLog.LogManager.Shutdown();
        }
}

public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
             logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));

            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()  // NLog: setup NLog for Dependency injection
            //.UseApplicationInsights()
            .Build();


}

Выше находится файл Program.cs для моего проекта.Я ожидаю, что NLog должен отправлять только одно сообщение об ошибке на мою электронную почту за раз для каждого регистрируемого действия, но вместо этого я получаю различное количество повторяющихся сообщений об ошибках.

1 Ответ

0 голосов
/ 06 июня 2019

Я получал «дубликаты» электронных писем для исключения Microsoft.EntityFrameworkCore.DbUpdateException от NLog:

  • Однажды из начального места было выброшено, что включало фрагмент полной трассировки стека (начиная с Microsoft.EntityFrameworkCore.DbContext.d__48.MoveNext ())

  • И другой, включающий полную трассировку стека, начиная с запроса - Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext ().Это было гораздо более полезное сообщение, поскольку оно показывает, какое действие контроллера было вызвано, логический путь, по которому оно идет, и т. Д.

С помощью следующего фрагмента кода я смог отловить толькоПоследняя ошибка (из второго пункта выше):

public class ControllerBase : Controller
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        NLog.LogManager.DisableLogging();
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        NLog.LogManager.EnableLogging();
    }
}

В качестве примечания: я не верю, что это решение подходит для любой конфигурации проекта (например, если есть экземпляр IExceptionFilter, который устанавливает context.ExceptionHandled =true исключение никогда не будет поймано NLog).

...