簡體   English   中英

在ASP.NET Core中分離應用程序級日志記錄和框架級日志記錄

[英]Separating application level logging and framework level logging in ASP.NET Core

如果我將日志記錄服務添加到容器(在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級別執行應用程序日志記錄,而不是在框架級別執行。 該框架已經內置了日志記錄,只需設置適當的日志記錄詳細級別即可啟用該日志。

這是什么意思? 這是否意味着不建議在客戶端代碼(app logic)中使用ILogger / ILoggerFactory?

什么是將應用程序級日志記錄與框架級日志記錄分開的優雅解決方案 現在我正在使用Serilog並通過ContextSource過濾,但這遠非優雅......

在應用程序及其API級別執行應用程序日志記錄,而不是在框架級別執行我認為此處的消息是您不應該嘗試並記錄每個請求詳細信息,因為框架已經記錄了這一點。

在混合框架日志事件和應用程序日志事件時 - 文檔還指出:

創建記錄器時,必須提供類別名稱。 類別名稱指定日志記錄事件的來源。 按照慣例,此字符串是分層的,類別由點(。)字符分隔。 一些日志記錄提供程序具有利用此約定的過濾支持,從而可以更輕松地查找感興趣的日志記錄輸出。

默認情況下,當使用注入的ILogger<MyAppLogicService> ,類別名稱是否為類的全名(帶名稱空間)。

因此,為了避免使用框架信息混亂您的日志,您可以通過僅包含與您的命名空間匹配的類別來過濾掉所有噪音。 使用ConsoleLogger它看起來像這樣:

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

我想這類似於“使用Serilog並通過ContextSource過濾”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM