在控制台应用程序中注入ILoggerFactory与在asp.net core 1.1中实例化ILoggerFactory的区别。

5

我使用asp.net core 1.1编写了一个简单的控制台应用程序。 我设置了Kestrel主机,并使用Configure方法注入了IApplicationBuilderILoggerFactory。 我在loggerFactory上调用AddConsole扩展。 然后我运行最简单的中间件,输出一条消息。 以下是应用程序代码:

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.

当我访问“localhost: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”实例行为不同?
1个回答

2
我在编写ASP.NET Core Logging教程时也遇到了同样的问题。深入研究代码后发现,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。至少这是我的结论 :)

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