Asp.net core 是否可以信任ILogger捕获/记录所有未捕获的异常?

Asp.net core 是否可以信任ILogger捕获/记录所有未捕获的异常?,asp.net-core,Asp.net Core,标题要求一切 是否曾经有过,ILogger是否会记录未捕获的异常,如果是,何时会记录 我问的原因是;我正在配置滚动条,它会记录所有的ILogger日志以及未捕获的异常。这将创建2个日志。我正在考虑禁用Rollbar的日志未捕获异常,因为我相信ILogger已经捕获了所有异常 这个问题不是关于Rollbar tho:)否。它是一个接口。它没有任何作用。相反,ILogger的实现应该记录未捕获的异常。听起来Rollbar已经在做日志记录了,所以您应该继续使用它来记录未捕获的异常,或者切换到其他库,如

标题要求一切

是否曾经有过,
ILogger
是否会记录未捕获的异常,如果是,何时会记录

我问的原因是;我正在配置滚动条,它会记录所有的
ILogger
日志以及未捕获的异常。这将创建2个日志。我正在考虑禁用Rollbar的日志未捕获异常,因为我相信
ILogger
已经捕获了所有异常

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

否。它是一个接口。它没有任何作用。相反,
ILogger
的实现应该记录未捕获的异常。听起来Rollbar已经在做日志记录了,所以您应该继续使用它来记录未捕获的异常,或者切换到其他库,如NLog、Serilog或log4net

就我个人而言,我发现有些库在不同的情况下会丢失消息,所以测试日志库是很重要的。仅仅相信信息被正确书写是不够的。您可以编写单元测试,以确保代码使用Moq正确记录异常。下面是一个来自中国的例子

\u loggerMock.Verify
(
l=>l.Log
(
//检查严重性级别
日志级别错误,
//这可能与您的场景有关,也可能与您的场景无关
It.IsAny(),
//这是神奇的Moq代码,它公开了扩展方法的内部日志处理
它是((状态,t)=>
//这将确认向记录器发送了正确的日志消息。{OriginalFormat}应与传递给记录器的值匹配
//注意:应该从可能将字符串存储在资源文件中的服务检索消息
CheckValue(状态,LogTest.ErrorMessage,“{OriginalFormat}”)&&
//这确认键为“recordId”的参数发送时具有正确的值
//在Application Insights中,这将出现在自定义维度中
检查值(状态、记录ID、名称(记录ID))
),
//确认异常类型
It.IsAny(),
//在此处接受任何有效的Func。该Func由扩展方法指定
(Func)It.IsAny()),
//确保消息记录的次数正确
正是(1)
);
但是,即使这样也不能保证Rollbar或其他一些记录器一定会将您的消息发送到日志位置。您只能通过观察记录器的输出来确认这一点

您还应该看到
ILogger
文档的一部分,该文档解释了如何配置日志记录并可能对其进行过滤。

否。是一个界面。它没有任何作用。相反,
ILogger
的实现应该记录未捕获的异常。听起来Rollbar已经在做日志记录了,所以您应该继续使用它来记录未捕获的异常,或者切换到其他库,如NLog、Serilog或log4net

就我个人而言,我发现有些库在不同的情况下会丢失消息,所以测试日志库是很重要的。仅仅相信信息被正确书写是不够的。您可以编写单元测试,以确保代码使用Moq正确记录异常。下面是一个来自中国的例子

\u loggerMock.Verify
(
l=>l.Log
(
//检查严重性级别
日志级别错误,
//这可能与您的场景有关,也可能与您的场景无关
It.IsAny(),
//这是神奇的Moq代码,它公开了扩展方法的内部日志处理
它是((状态,t)=>
//这将确认向记录器发送了正确的日志消息。{OriginalFormat}应与传递给记录器的值匹配
//注意:应该从可能将字符串存储在资源文件中的服务检索消息
CheckValue(状态,LogTest.ErrorMessage,“{OriginalFormat}”)&&
//这确认键为“recordId”的参数发送时具有正确的值
//在Application Insights中,这将出现在自定义维度中
检查值(状态、记录ID、名称(记录ID))
),
//确认异常类型
It.IsAny(),
//在此处接受任何有效的Func。该Func由扩展方法指定
(Func)It.IsAny()),
//确保消息记录的次数正确
正是(1)
);
但是,即使这样也不能保证Rollbar或其他一些记录器一定会将您的消息发送到日志位置。您只能通过观察记录器的输出来确认这一点


您还应该看到
ILogger
文档的一部分,该文档解释了如何配置日志记录并可能对其进行过滤。

应该这样做。但是,
ILogger
本身不做任何事情。因此,由应用程序的各个部分(包括框架和自定义代码)来记录他们想要记录的内容。当然,除非在尝试记录条目时出现了
ILogger
错误。除此之外,我支持Chris Pratt所说的。从asp.net核心的角度来看,管道早期的中间件应该能够捕获所有未捕获的错误,因为它会向上游冒泡。我自己的观察是,
Program.main
日志的第一行。我相信一切都被抓住了,但如果我有一个明确的答案,我可以与Rollbar分享。Rollbar记录了两次未捕获的异常,他们的开发人员做出了我想要验证的声明:“通常,任何代码库都不能保证捕获异常并通过ILogger报告它们。”这是以下两个主题的组合,应该是这样的。但是,
ILogger
本身不做任何事情。因此,由应用程序的各个部分(包括框架和自定义代码)来记录他们想要记录的内容。当然,除非在尝试执行lo时,ILogger出现错误
_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)
);