我一直在使用 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)
写入 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(...)
| 归档时间: |
|
| 查看次数: |
3482 次 |
| 最近记录: |