c# - 在控制台应用程序中注入(inject) ILoggerFactory 与在 asp.net core 1.1 中实例化一个

标签 c# logging asp.net-core

我使用 asp.net core 1.1 组合了一个简单的控制台应用程序。 我设置了 Kestrel 托管并使用了一个 Configure 方法来注入(inject) 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.

访问“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 Core Logging Tutorial .深入研究代码表明,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。至少那是我的结论:)

关于c# - 在控制台应用程序中注入(inject) ILoggerFactory 与在 asp.net core 1.1 中实例化一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40830318/

相关文章:

c# - 如何对使用 Entity Framework 的存储库模式进行单元测试?

c# - ToString 没有重载方法需要 2 个参数

c# - WPF 数据网格绑定(bind)问题 : first row bound but doesn't update selected item in two-way fashion

c# - 在 asp.net core 上使用来自不同项目的另一个 Controller

asp.net-core - 如何扩展服务器端 Blazor 应用程序?

C# MVC 路由检测

Python 记录多个模块

MySQL查询结果的历史记录?

MySQL集群: How to decode/interpret binary logs?

c# - 使用 EF Core 在另一个实体中创建唯一键的外键