簡體   English   中英

在控制台應用程序中注入ILoggerFactory與在asp.net核心1.1中實例化一個

[英]Injecting ILoggerFactory in Console app vs instantiating one in asp.net core 1.1

我使用asp.net core 1.1整理了一個簡單的Console應用程序。 我設置了Kestrel托管並使用了一個Configure方法,我注入了IApplicationBuilderILoggerFactory 我呼吁的LoggerFactoryAddConsole擴展。 然后我運行最簡單的中間件,輸出一條消息。 應用程序代碼如下所示:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace DemoILoggerFactory
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Program>()
                .Build();
            host.Run();
        }

        public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();
            app.Run( async context => {
                await context.Response.WriteAsync("Message ..");
            });
        }
    }
}

當我運行應用程序時,我在控制台中獲得以下輸出:

Hosting environment: QQ
Content root path: F:\REPOS CORE     1.0.0\LOGGING\DemoILoggerFactory\src\DemoILoggerFactory\bin\Debug\netcoreapp1.0
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

訪問“locahost:5000”后,控制台中會顯示以下日志信息:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 125.5854ms 200
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/favicon.ico
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 0.9471ms 200

后來我從Configure參數中刪除了ILoggerFactory,並在Configure方法中實例化了一個。 唯一的區別是Configure方法的簽名和LoggerFactory的即時消息。 修改后的代碼如下所示:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace DemoILoggerFactory
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Program>()
                .Build();
            host.Run();
        }

        public void Configure(IApplicationBuilder app)
        {
            ILoggerFactory loggerFactory = new LoggerFactory();
            loggerFactory.AddConsole();
            app.Run( async context => {
                await context.Response.WriteAsync("Message ..");
            });
        }
    }
}

現在,運行應用程序,在訪問localhost:5000之前,控制台窗口中顯示以下信息:

Hosting environment: QQ
Content root path: F:\REPOS CORE 1.0.0\LOGGING\DemoILoggerFactory\src\DemoILoggerFactory\bin\Debug\netcoreapp1.0
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

在我重新訪問“localhost:5000”后,控制台中不會顯示其他請求日志。

對於這兩種情況,Project.json文件如下:

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.1.0"
    },
    "Microsoft.AspNetCore.Hosting": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.AspNetCore.Http": "1.1.0"
  },

  "frameworks": {
    "netcoreapp1.1": {
      "imports": "dnxcore50"
    }
  }
}

我錯過了什么? 為什么兩個“LoggerFactory”實例的行為不同?

編寫ASP.NET核心日志教程時,我的體驗完全相同。 深入研究代碼表明,Kestrel還依賴於Microsoft.Extensions.Logging。 啟動時,Kestrel將一個記錄器添加到ASP.NET Core初始化的ILoggerFactory 記錄器記錄有關Kestrel內部的大量數據,有關TCP連接,HTTP請求等的信息。如果降低Microsoft.AspNetCore.Server.Kestrel記錄器類別的最低級別,您將看到來自Kestrel的更多日志消息。 此外,如果您在調試器中檢查ASP.NET Core提供的ILoggerFactory ,您將看到Kestrel記錄器,這是您自己創建的記錄器中沒有的。

雖然您可以通過手動創建KestrelTrace來配置來自Kestrel的相同數量的日志消息,但我認為您最好使用ASP.NET Core提供的ILoggerFactory 至少那是我的結論:)

暫無
暫無

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

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