【问题标题】:Separating application level logging and framework level logging in ASP.NET Core在 ASP.NET Core 中分离应用程序级日志记录和框架级日志记录
【发布时间】:2016-05-04 12:07:45
【问题描述】:

如果我将日志服务添加到容器(在 ASP.NET 5 RC1 中):

services.AddSingleton<ILoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
//or just services.AddLogging();

然后我可以在我的应用层中使用 Logger:

class MyAppLogicService
{
    public MyAppLogicService(ILogger<MyAppLogicService> logger) 
    { 
        logger.LogInformation("Hey");
    }
}

但在这种情况下,我的 logger.LogInformation() 事件将与 不重要 框架信息事件混合(根据开发人员的说法,每个请求最多 10 个!)。

ASP.NET 5 documentation states:

建议您在级别执行应用程序日志记录 您的应用程序及其 API,而不是在框架级别。这 框架已经内置了日志记录,可以简单地通过 设置适当的日志记录详细级别。

这是什么意思?是不是不建议在客户端代码(app逻辑)中使用ILogger/ILoggerFactory?

将应用程序级日志记录与框架级日志记录分开的优雅解决方案是什么? 现在我正在使用 Serilog 并通过 ContextSource 进行过滤,但这远非优雅......

【问题讨论】:

    标签: c# logging asp.net-core


    【解决方案1】:

    在您的应用程序及其 API 级别执行应用程序日志记录,而不是在框架级别 我认为这里的信息是您不应该尝试记录每个请求详细信息,因为框架已经记录了这些详细信息。

    关于混合框架日志事件和应用程序日志事件 - 文档还指出:

    创建记录器时,必须提供类别名称。类别名称指定记录事件的来源。按照惯例,此字符串是分层的,类别由点 (.) 字符分隔。一些日志记录提供程序具有利用此约定的过滤支持,从而更容易找到感兴趣的日志输出。

    默认情况下,当使用注入的ILogger&lt;MyAppLogicService&gt; 时,类别名称如果是类的全名(带有命名空间)。

    因此,为避免您的日志因框架信息而变得混乱,您可以过滤掉所有噪音,只包含与您的命名空间匹配的类别。当使用ConsoleLogger 时,它看起来像这样:

    loggerFactory.AddConsole((cat, level) => cat.StartsWith("mynamespace."));
    

    我想这类似于“使用 Serilog 并通过 ContextSource 过滤”。

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      相关资源
      最近更新 更多