NLog为什么会创建重复的错误消息?

时间:2019-01-31 18:45:25

标签: c# error-handling asp.net-core-mvc nlog

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 :(得分:-1)

我从NLog收到有关Microsoft.EntityFrameworkCore.DbUpdateException的“重复”电子邮件:

  • 从初始位置开始抛出该错误,其中包括完整堆栈跟踪的一部分(从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捕获)。