【问题标题】:How use Serilog email with asp.net core 2.1如何在 asp.net core 2.1 中使用 Serilog 电子邮件
【发布时间】:2019-12-06 19:51:51
【问题描述】:

在我的 asp.net core 2.1 项目中,想要在错误事件中发送邮件。 我有一个错误控制器,可以捕获全局错误并使用 ILogger 记录它们

现在在 Program.cs 的主要方法中,我按照文档的建议进行操作 但是邮件没有发送! 如果我在 ErrorController 中移动代码,Sink 可以工作,但我认为这是不好的方式

public static void Main(string[] args)
    {
         var emailInfo = new EmailConnectionInfo
         {
             FromEmail = "xxx",
             ToEmail = "xxxx;",
             MailServer = "smtp.gmail.com",
             EmailSubject = "Error "
        };

         using (var logger = new LoggerConfiguration()
                 .MinimumLevel.Error()
                 .WriteTo.Email(emailInfo,
                     outputTemplate: "{Timestamp:HH:mm:ss}\t{Level:u3}\t{SourceContext}\t{Message}{NewLine}{Exception}")
                .CreateLogger()
              )
        {
            logger.Error("Error occured (test)...");
            //CreateWebHostBuilder(args).Build().Run(); or here...
        }

        CreateWebHostBuilder(args).Build().Run();
    }

测试邮件已发送,但应用程序错误时未发送

我在 ErrorController 中使用 Microsoft 扩展的 Logger

public ErrorController(ILogger<ErrorController> logger)
    {
        this.logger = logger;
    }

然后在错误控制器的方法中我调用 logger.LogError(exception);

       var feature = HttpContext.Features.Get<IExceptionHandlerFeature>();
        logger.LogError(feature.Error);

【问题讨论】:

  • 我怀疑真正的问题是如何集成 Serilog 和 ASP.NET Core 日志记录。此处发布的代码不使用 Serilog 记录任何内容。控制器中的任何日志调用都将使用 ASP.NET Core 的默认日志配置
  • 那么我必须如何在我的应用程序中设置电子邮件接收器?我有点困惑
  • 很好地发现了@PanagiotisKanavos ... OP,您仍然需要实际连接 Serilog 和 ASP.NET Core 才能协同工作。 github.com/serilog/serilog-aspnetcore 中的 README 示例涵盖了所有这些内容。
  • tks 是我忽略的好链接。但是对于 netcore 2.2 是否具有进程模式?适合 netcore 2.1 吗?

标签: asp.net-core serilog


【解决方案1】:

您没有告诉应用程序使用 SeriLog。 试试下面的代码。

using (var logger = new LoggerConfiguration()
         .MinimumLevel.Error()
         .WriteTo.Email(emailInfo,
             outputTemplate: "{Timestamp:HH:mm:ss}\t{Level:u3}\t{SourceContext}\t{Message}{NewLine}{Exception}")
        .CreateLogger())
{
    logger.Error("Error occured (test)...");
    CreateWebHostBuilder(args)
         .UseSerilog(logger)
         .Build().Run();
}

就个人而言,我使用静态 Log.Logger 属性在 Startup.Configure 方法中创建我的记录器实例。但是上面的方法也应该可以。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(this.Configuration)
            .CreateLogger();
        ...
    }

我不太确定默认实现如何与 SeriLog 配合使用。您可能需要从 appsettings.json 文件中删除所有日志记录设置。

【讨论】:

  • tks 很多。它运行良好:所以我可以删除 errorcontroller 中的日志并使用 program.cs。再次感谢伙计。有美好的一天
  • 唯一奇怪的是我收到了两个日志。例如,我将自定义错误创建为 CustomerNotFoundException,并将其保存在 txt、数据库中并在电子邮件中写入两次
【解决方案2】:

代码中的using 块会在应用程序启动之前拆除 Serilog。

尝试在块内运行应用程序:

    using (var logger = new LoggerConfiguration()
             .MinimumLevel.Error()
             .WriteTo.Email(emailInfo,
                 outputTemplate: "{Timestamp:HH:mm:ss}\t{Level:u3}\t{SourceContext}\t{Message}{NewLine}{Exception}")
            .CreateLogger())
    {
        logger.Error("Error occured (test)...");
        CreateWebHostBuilder(args).Build().Run();
    }

【讨论】:

  • 我尝试过,应用程序仍然有效,但没有发送邮件。 Tks 寻求帮助
  • 但是在开发模式下,我在 debugconsole 中看到消息:发送一批 2 个日志
  • @herosuper 你没有发布任何使用记录器的代码。您看到的消息来自 ASP.NET Core 的日志记录,而不是 Serilog。
  • 我在 ErrorController 中使用 ILogger 来运行自定义异常,如果我在该控制器中编写上述代码,则会发送电子邮件,但我不确定方法是否正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2018-10-27
  • 2019-02-19
相关资源
最近更新 更多