标题全部问了。
有没有,如果有,ILogger
不会记录未捕获的异常吗?
我要问的原因是;正在配置Rollbar,它将记录所有ILogger
日志以及未捕获的异常。这将创建2个日志。我正在考虑禁用ILogger
已经捕获到所有这些日志,从而禁用Rollbar的日志未捕获异常。
这个问题不是关于Rollbar tho:)
答案 0 :(得分:0)
不。 ILogger
是一个界面。它什么也没做。相反,ILogger
的实现应记录未捕获的异常。听起来好像Rollbar已经在进行日志记录,所以您应该继续使用该日志记录未捕获的异常,或者切换到其他库,例如NLog,Serilog或log4net。
我个人发现,有些库在不同情况下会丢失消息,因此测试日志库很重要。仅相信消息已正确编写是不够的。您可以编写单元测试,以确保您的代码使用Moq正确记录了异常。这是来自this article的示例。
_loggerMock.Verify
(
l => l.Log
(
//Check the severity level
LogLevel.Error,
//This may or may not be relevant to your scenario
It.IsAny<EventId>(),
//This is the magical Moq code that exposes internal log processing from the extension methods
It.Is<It.IsAnyType>((state, t) =>
//This confirms that the correct log message was sent to the logger. {OriginalFormat} should match the value passed to the logger
//Note: messages should be retrieved from a service that will probably store the strings in a resource file
CheckValue(state, LogTest.ErrorMessage, "{OriginalFormat}") &&
//This confirms that an argument with a key of "recordId" was sent with the correct value
//In Application Insights, this will turn up in Custom Dimensions
CheckValue(state, recordId, nameof(recordId))
),
//Confirm the exception type
It.IsAny<NotImplementedException>(),
//Accept any valid Func here. The Func is specified by the extension methods
(Func<It.IsAnyType, Exception, string>)It.IsAny<object>()),
//Make sure the message was logged the correct number of times
Times.Exactly(1)
);
但是,即使这样也不能保证Rollbar或其他记录器一定会将您的消息发送到日志位置。您只能通过观察记录器的输出来确认这一点。
您还应该参阅ILogger
文档中的this section,该文档说明了如何配置日志记录并可能对其进行过滤。