【发布时间】:2021-08-16 21:22:24
【问题描述】:
我(作为一个新手)正在实现我自己的自定义记录器,以便在 ASP.NET Core MVC 应用程序中使用。我有这个记录器在各个方面都功能工作。但是到目前为止我作弊了一点,即我实现了ILogger.IsEnabled方法如下:
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
从功能上讲,这很好用,因为框架确保只有在日志级别等于或高于指定级别时才调用Log() 方法。因此,正确的“事物”被记录下来,而较低级别的“事物”没有按预期记录。
但是,我还想在我的代码中支持以下类型的情况,其中_logger 输入为ILogger 并正确注入到我的控制器中:
if (_logger.IsEnabled(LogLevel.Debug))
{
_logger.LogDebug("This is an expensive message to generate: " +
JsonConvert.SerializeObject(request));
}
为了使其有效,我的IsEnabled() 方法应该能够知道使用我的LoggerProvider 创建的记录器实例的日志级别是什么,但我不知道如何直接获取该信息,或者如何正确地将其传递给我正在使用的记录器的注入实例。
我能够找到的复杂示例和教程似乎在每种情况下都是针对控制台应用程序类型而不是网络应用程序类型构建的,到目前为止,我未能通过模板化的Startup 弄清楚如何做到这一点ASP.NET MVC 中的类。
如果注入的实例中没有注册记录器正在处理Debug 日志,为了避免不必要的序列化(在我的示例中),停止在我的自定义 IsEnabled() 方法中作弊的最简单和最有效的方法是什么等级?或者您有没有最喜欢的 ASP.NET 核心设置示例或教程可以指点我?
【问题讨论】:
-
如果您使用 appsettings.{Environment}.json 文件配置日志记录,您可以从 appsettings.{Environment}.json 文件获取当前日志记录级别,并将其添加到您的条件中。参考:Configure logging.
-
谢谢@ZhiLv - 这是一个好主意,我也考虑过 - 虽然要制作一个非作弊版本,但如果我愿意,我必须循环浏览各种条目的所有排列制定一个通用的解决方案。而且由于大概 .NET 日志记录扩展已经在这样做了,复制整个过程似乎很可惜......
标签: c# asp.net-core logging