【问题标题】:How to trap ILogger.LogCritical call and break in debugger?如何在调试器中捕获 ILogger.LogCritical 调用和中断?
【发布时间】:2019-09-09 07:39:28
【问题描述】:

当有人写一个Microsoft.Extensions.Logging.ILogger.LogCritical() 电话时,肯定发生了一些严重的事情。我希望它在调试器中运行时会(记录关键和)中断。我试过How to override an existing extension method 的答案,它需要使用特殊的命名空间。但是我希望大家可以自然的使用LogCritical(),不用再仔细检查是调用原来的LogCritical()还是我被困的那个。

我能想到的唯一方法是用我的替换后备日志库,并使用我的中断逻辑将调用重定向到日志库。但是这个工具仅限于指定的库。如果将来我想更改库,我需要实现另一个库。并实现它需要的所有无聊的接口,只是为了几个LogCritical()相关的破坏逻辑。

所以,我希望捕获一般的ILogger.LogCritical() 调用,而不是底层的具体调用。这可能吗?

【问题讨论】:

  • .NET Core 日志框架允许您注册许多记录器,我建议您创建一个新的自定义记录器来执行您想要的操作,并将其与现有的 NLog 记录器结合使用。

标签: c# debugging .net-core nlog ilogger


【解决方案1】:

不确定您在寻找什么。但也许是这样的:

   var logFactory = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config");
   #if DEBUG
   var debugBreakTarget = new NLog.Targets.MethodCallTarget("DebugBreak", (logEvent,parms) => System.Diagnostics.Debugger.Break());
   var debugBreakRule = new NLog.Config.LoggingRule("*", NLog.Level.Fatal, debugBreakTarget);
   logFactory.Configuration.LoggingRules.Insert(0, debugBreakRule);
   logFactory.ReconfigExistingLoggers();
   #endif
   var logger = logFactory.GetCurrentClassLogger();

显示 NLog-specific-solution,因为您已将 NLog-tag 添加到您的问题中。

另请参阅:https://github.com/NLog/NLog/wiki/MethodCall-target

【讨论】:

  • 感谢您的回答。我希望对 ILogger 有一个一般性的陷阱,而不是 NLog 特定的陷阱。但是你的MethodCallTarget 对我来说是个新东西。但是在我尝试之后(在 NLog.config 中),如果我使用 async="true",调用堆栈不包括 LogCritical() 之一。 (虽然在日志文件中我可以找到最后一个致命日志,但调试器中的中断要好得多。我可以检查调试器中相关的每个值,而不仅仅是日志消息。)只有async="false" 有效。但这对性能影响很大,我目前的项目不能接受。
  • @ChrisTorng 使用 NLog.config 时,您可以有多个 部分。您可以将 MethodCall-target 放在其自己的 -section 中,并带有 async="false"
  • 我不应该尝试 NLog.config 之一。它使生产环境检查每个日志请求,使所有日志变慢。我应该使用您的#if DEBUG 方式,这只影响调试环境。尽管您的方式仅适用于 NLog 库,但不是我希望通用ILogger.LogCritical 陷阱的原始问题。但它确实解决了我当前项目的问题。因此,我将您的答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2013-07-06
  • 2011-02-18
  • 2018-10-13
相关资源
最近更新 更多