在ASP.NET Core中分离应用程序级日志记录和框架级日志记录

Dis*_*lis 10 c# logging asp.net-core

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

services.AddSingleton<ILoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
//or just services.AddLogging();
Run Code Online (Sandbox Code Playgroud)

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

class MyAppLogicService
{
    public MyAppLogicService(ILogger<MyAppLogicService> logger) 
    { 
        logger.LogInformation("Hey");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ASP.NET 5文档说明:

建议您在应用程序及其API级别执行应用程序日志记录,而不是在框架级别执行.该框架已经内置了日志记录,只需设置适当的日志记录详细级别即可启用该日志.

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

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

qbi*_*bik 2

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

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

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

默认情况下,当使用injected时ILogger<MyAppLogicService>,类别名称是类的全名(带有命名空间)。

因此,为了避免框架信息使日志混乱,您可以通过仅包含与您的命名空间匹配的类别来过滤掉所有噪音。使用时ConsoleLogger会是这样的:

loggerFactory.AddConsole((cat, level) => cat.StartsWith("mynamespace."));
Run Code Online (Sandbox Code Playgroud)

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