Serilog.Sinks.Email - 没有失败迹象?

Jam*_*ndy 3 serilog

我一直在使用 Serilog.Sinks.Email,我注意到(除了我没有收到电子邮件这一事实之外),当我执行 Log 语句时,没有任何异常或任何指示失败的情况。即使我为 MailServer 添加了垃圾,Log 语句也会像成功执行一样执行。

我已经尝试过 SelfLog 语句,但在“输出”窗口中看不到任何内容。

Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
Run Code Online (Sandbox Code Playgroud)

我添加了 SymbolSource ( http://www.symbolsource.org/Public/Wiki/Using ),并且能够单步执行 Serilog 的代码,但再一次没有捕获到任何异常。

Serilog 真的没有给出任何错误指示,还是我遗漏了一些东西?

使用:.NET Framework 4.6.2、Serilog 2.8、Serilog.Sinks.Email 2.3

示例代码:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Email(new EmailConnectionInfo
    {
        FromEmail = "xxx",
        ToEmail = "xxx",
        MailServer = "smtp.xxx.com",
        EmailSubject = "My Test"
    }
    ).CreateLogger();

Log.ForContext<Program>().Error("Test Number {Parm}", "1");
Run Code Online (Sandbox Code Playgroud)

Cai*_*ete 7

写入 Serilog 记录器应该是一个安全的操作,并且从设计上不会抛出异常,因此发送电子邮件时发生的任何异常只会出现在SelfLog- 在您的情况下,它将写入控制台Debug

现在,您甚至没有看到异常的原因是SelfLog因为通过发送的电子邮件是异步Serilog.Sinks.Email发送的,并且您的程序在接收器有机会发送电子邮件之前终止。

在程序终止之前,您需要调用Log.CloseAndFlush()以便在应用程序关闭之前发送所有日志。

static void Main(string[] args)
{
    Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

    Log.Logger = new LoggerConfiguration()
        .WriteTo.Email(...)
        .CreateLogger();

    try
    {
        Log.ForContext<Program>().Error("Test Number {Parm}", "1");

        // ...
    }
    finally
    {
        Log.CloseAndFlush();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您查看您通过 编写的错误消息SelfLog

您可以在文档中阅读更多相关信息:记录器的生命周期


ps:如果您正在记录的操作足够重要,您希望保证它成功(或者如果没有成功则抛出异常),那么您应该使用Audit Logging,即使用.AuditTo.Email(...)而不是.WriteTo.Email(...)

  • @JamesinIndy [这是设计使然](https://github.com/serilog/serilog/wiki/Reliability)。写入 Serilog 记录器应该是安全的操作,并且永远不会抛出异常。如果您正在记录的操作足够重要,您希望保证它成功(如果不成功则抛出异常),那么您应该使用[审核日志记录](https://github.com/serilog/serilog/ wiki/Reliability),即使用 `.AuditTo.Email(...)` 而不是 `.WriteTo.Email(...)`... (2认同)