Serilog.Sinks.Email-没有故障指示吗?

时间:2019-07-31 15:26:06

标签: serilog

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

我已经尝试了SelfLog语句,但是在“输出”窗口中什么也没看到。

Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));

我添加了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");

1 个答案:

答案 0 :(得分:2)

写给Serilog记录器写信是一种安全的操作,绝不会抛出异常by design,因此,发送电子邮件时发生的任何异常都只会出现在SelfLog中-情况下,它将写入Debug控制台。

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

在程序终止之前,您需要调用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();
    }
}

这将使您可以查看通过SelfLog编写的错误消息。

您可以在文档Lifecycle of Loggers中了解更多相关信息。


ps:如果您要记录的操作非常重要,以至于您想保证操作成功(或者抛出异常,则抛出异常),则应使用Audit Logging,即使用{{1} },而不是.AuditTo.Email(...)