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