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

10

如果我给 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文档声明:

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

这是什么意思?这是否意味着不推荐在客户端代码(应用程序逻辑)中使用ILogger / ILoggerFactory?

如何优雅地将应用程序级别的记录与框架级别的记录分离?目前,我正在使用Serilog并通过ContextSource过滤,但这远非优雅...

1个回答

2
在应用程序及其API的级别上执行应用程序日志记录,而不是在框架级别上执行。我认为这里的信息是您不应尝试记录每个请求的详细信息,因为框架已经记录了这些信息。
关于混合框架日志事件和应用程序日志事件 - 文档还指出:
创建记录器时必须提供类别名称。类别名称指定日志事件的来源。按照惯例,此字符串是分层的,使用点(.)字符分隔类别。一些日志提供程序具有过滤支持,利用此约定使查找感兴趣的日志输出更加容易。
默认情况下,使用注入的ILogger 时,类别名称是类的完整名称(包括命名空间)。
因此,为了避免用框架信息填满您的日志,您可以通过仅包括与您的命名空间匹配的类别来过滤所有噪音。当使用ConsoleLogger时,它看起来像这样:
loggerFactory.AddConsole((cat, level) => cat.StartsWith("mynamespace."));

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接