【问题标题】:Serilog.Sinks.Email - No Indication of Failure?Serilog.Sinks.Email - 没有失败的迹象?
【发布时间】:2019-08-03 01:47:39
【问题描述】:

我一直在使用 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");

【问题讨论】:

  • 我现在不打算检查,但如果xxx.com 不是注册域,我会感到非常惊讶:)
  • 哈,不错的收获! xxx 正在替换我的代码中的实际值:)。对于整个 MailServer 值,我尝试的实际垃圾值是“未知”或“不存在”。

标签: serilog


【解决方案1】:

写入 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,即使用.AuditTo.Email(...) 而不是@ 987654337@

【讨论】:

  • 感谢您提供的信息!但是,在添加之后,即使使用垃圾邮件服务器值或不正确的凭据,仍然没有捕获到错误。
  • @JamesinIndy 也许您没有在输出窗口中查看?在上面的示例中,您将SelfLog 配置为写入Debug...i.imgur.com/sFrxb8a.png
  • 啊哈,现在我已经添加了 CloseAndFlush(),在执行该语句后,我在输出窗口中看到了我的 SelfLog 错误。我觉得奇怪的是它没有命中 Catch 语句——再说一次,如果我抓住了它,我会怎么做?我已经在尝试记录错误,所以如果失败,记录失败的日志也可能会失败。
  • @JamesinIndy That is by design。写入 Serilog 记录器应该是一种安全操作,并且永远不会抛出异常。如果您正在记录的操作非常重要,以至于您想保证它成功(或者如果没有成功则抛出异常),那么您应该使用Audit Logging,即使用.AuditTo.Email(...) 而不是.WriteTo.Email(...)...
猜你喜欢
  • 2019-12-14
  • 1970-01-01
  • 2014-08-02
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2010-09-14
相关资源
最近更新 更多