.NET Core 2.0日志记录是否已损坏?

时间:2017-08-20 11:57:50

标签: c# .net asp.net-core .net-core

升级到.NET Core 2.0(+ ASP.NET Core 2.0)后,似乎无法获得跟踪级别日志信息。

实际上,如果我执行dotnet new web项目并在Startup for Configure中添加以下代码,我不会收到任何跟踪或调试日志消息,但我收到两次信息和错误消息。注释掉.AddConsole()调用将仅输出这些(信息和错误)一次 - 建议默认情况下使用控制台提供程序自动配置它。请注意,这是一个"文件 - >新"项目经验,Program.cs中没有任何设置可用于记录或配置 - 除了我已经添加的内容。有谁见过的东西?或者我应该为它注册一个GitHub问题。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Microsoft.Extensions.Logging.LogLevel.Trace);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        var logger = loggerFactory.CreateLogger("Blah");
        logger.LogTrace("Hello world : Trace");
        logger.LogDebug("Hello world : Debug");
        logger.LogInformation("Hello world : Information");
        logger.LogError("Hello world : Error");

        await context.Response.WriteAsync("Hello World!");
    });
}

4 个答案:

答案 0 :(得分:32)

配置日志记录的方式发生了一些变化...推荐的方法(现在this GitHub issue/announcement中已经很好地记录了这一点)是在AddLogging方法上配置记录器,例如

services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        .AddConsole()
        .AddDebug();
});

并拥有appsettings.json之类的

注意

似乎有些人感到困惑,因为该示例仅演示了Console提供程序的配置,而不是所有记录器的配置。

LogLevel部分配置所有命名空间(Default键)或特定命名空间(System的日志记录级别,覆盖其命名空间以{{1开头的所有类日志记录的默认值}}

这适用于System.*T中使用的类。这允许为此命名空间中的记录器设置高于或低于默认日志记录级别。

ILogger<T>

请注意,appsettings.json的结构与以前在.NET Core 1.x中的结构有所不同,而{ "ApplicationInsights": { "InstrumentationKey": "" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Information", "System": "Warning", "Microsoft": "Information" }, "Console": { "LogLevel": { "Default": "Warning", "System": "Information", "Microsoft": "Information" } } } } 中的Logging条目现在具有记录器提供程序名称,它允许您配置每个日志记录提供程序的日志记录级

以前,appsettings.json中的条目仅适用于控制台记录器。

或者,现在可以在appsettings.json内移动日志记录。

WebHostBuilder

更新

如果一个人不想使用public static void Main() { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddJsonFile("hosting.json", optional: false) .AddEnvironmentVariables(); }) .ConfigureLogging((webhostContext, builder) => { builder.AddConfiguration(webhostContext.Configuration.GetSection("Logging")) .AddConsole() .AddDebug(); }) .UseIISIntegration() .UseStartup<Startup>() .UseApplicationInsights() .Build(); host.Run(); } ,也可以在代码中注册过滤器。

appsettings.json

答案 1 :(得分:8)

我花了差不多二十分钟才意识到, Startup.cs 文件中的Configuration.GetSection("Logging") appsettings.json <中的配置中读取"Logging"部分/ em>文件,配置为"Error"。将其更改为"Information"或更低,修复了问题。

以下是 appsettinsg.json 文件的内容:

{
  "Logging": {
    "IncludeScopes": true,
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

要了解有关日志记录级别的更多信息(例如在"Information"中),请查看this链接,该链接还提供有关ASP.NET Core日志记录的一般信息。

我刚刚在这里发帖,以防您在使用日志记录工作时遇到任何问题,请确保您已经通过该JSON文件。

答案 2 :(得分:5)

以上任何内容对我都无效 唯一的解决方法是编写方法

private void ConfigLogging( ILoggingBuilder builder ) {
    builder.SetMinimumLevel( LogLevel.Trace );
    //... additional configuration...
}

使用AddLogging扩展方法时将其写为

services.AddLogging( ConfigLogging );

答案 3 :(得分:0)

appsettings.json的以下结构似乎可以正常工作:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console":
    {
      "IncludeScopes": true
    }
  }
}

取自enter image description here

另外,看看您的启动电话是什么,我发现以下对我有用的东西

public class Startup
{
    public Startup(IHostingEnvironment env)
    {

        var logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Sink(jsonSink)
                .Enrich.WithExceptionDetails()
                .CreateLogger();

        Log.Logger = logger;
    }
}