gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:40:00 33 4
gpt4 key购买 nike

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

最佳答案

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

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

在您的程序终止之前,您需要调用 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(...) 而不是 .WriteTo.Email(...)

关于Serilog.Sinks.Email - 没有失败的迹象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57294214/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com