是否可以信任ILogger来捕获/记录所有未捕获的异常?

时间:2019-06-27 15:17:00

标签: asp.net-core

标题全部问了。

有没有,如果有,ILogger不会记录未捕获的异常吗?

我要问的原因是;正在配置Rollbar,它将记录所有ILogger日志以及未捕获的异常。这将创建2个日志。我正在考虑禁用ILogger已经捕获到所有这些日志,从而禁用Rollbar的日志未捕获异常。

这个问题不是关于Rollbar tho:)

1 个答案:

答案 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,该文档说明了如何配置日志记录并可能对其进行过滤。