如何在 asp.net 核心 2.1 中使用 Serilog 电子邮件

How use Serilog email with asp.net core 2.1

在我的 asp.net 核心 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;
    }

然后在 errorcontroller 的方法中我调用 logger.LogError(exception);

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

代码中的 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();
    }

您没有告诉应用程序使用 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 文件中删除所有日志记录设置。