簡體   English   中英

.Net Serilog 電子郵件

[英].Net Serilog Email

我有一個 C# .net 5 Web 應用程序和 API,我正在嘗試將 Serilog 添加到其中。 我有用於電子郵件和 ms sql 的 serilog 接收器,但電子郵件似乎只在直接使用 Log 時發送。 這就是我所擁有的(為簡潔起見,有些項目未顯示):

在 Program.cs 中

        public static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            BuildConfig(builder);
            Log.Logger = CreateLogger(builder);

            try
            {
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception e)
            {
                Log.Fatal(e, "Host terminated unexpectedly");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

        public static Serilog.ILogger CreateLogger(ConfigurationBuilder builder)
        {
            var emailSettings = Configuration.GetSection("Serilog").GetSection("WriteTo").GetSection("0").GetSection("Args");
            var emailInfo = CreateEmailInformation(emailSettings);

            return new LoggerConfiguration()
                       .ReadFrom.Configuration(Configuration)
                       .Enrich.FromLogContext()
                       .WriteTo.Email(emailInfo)
                       .CreateLogger();
        }

所以上面的 Log.Fatal(...) 確實發送了一封電子郵件,但是在下面的 API 服務中 _logger 不發送電子郵件:

        private readonly AppDbContext _context;
        private readonly ILogger<CollectionRepository> _logger;

        public CollectionRepository(AppDbContext appDbContext, ILogger<CollectionRepository> logger)
        {
            _context = appDbContext;
            _logger = logger;
        }

        public async Task<List<amp.collection>> GetCollections()
        {
            var result = new List<amp.collection>();
            try
            {
                result = await db.GetCollections();
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Exception occurred in GetCollections()");
            }
            return result;
        }

為什么 _logger 不發送電子郵件,我錯過了什么?

更新問題似乎是由於電子郵件的異步。 在測試並在 _logger.Error() 之后立即添加 Log.CloseAndFlush() 后,電子郵件將被發送。

我沒有測試這是否有任何區別。 但至少我是這樣設置的:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.UseSerilog();
        });

我知道這里有一個與ILogger一起使用的示例(以獲取靈感): https ://github.com/elmahio/serilog-sinks-elmahio/tree/main/examples/Serilog.Sinks.ElmahIo.AspNetCore31

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM