Is .NET Core 2.0 logging broken?

后端 未结 4 550
情深已故
情深已故 2020-12-29 02:25

I can\'t seem to get Trace level log information outputted after upgrading to .NET Core 2.0 (+ASP.NET Core 2.0).

In fact, if I do a dotnet new webprojec

相关标签:
4条回答
  • 2020-12-29 02:42

    The following structure of appsettings.json seems to work fine:

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

    Taken from https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

    Also, see what your start up calls are, I find the following works for me:

    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
    
            var logger = new LoggerConfiguration()
                    .MinimumLevel.Information()
                    .WriteTo.Sink(jsonSink)
                    .Enrich.WithExceptionDetails()
                    .CreateLogger();
    
            Log.Logger = logger;
        }
    }
    
    0 讨论(0)
  • 2020-12-29 02:48

    I spent almost twenty minutes to realize that since Configuration.GetSection("Logging") in the Startup.cs file reads the section "Logging" from the config in the appsettings.json file, which was configured as "Error". Changing it to "Information" or anything lower, fixed the issue.

    Here's what the appsettinsg.json file looks now:

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

    To find out more about the levels of logging (such as in "Information"), check out this link, that also provides general information on ASP.NET Core logging.

    I'm just posting here, just in case you bump into any trouble with getting the logging to work, make sure you've been through that JSON file.

    0 讨论(0)
  • 2020-12-29 02:57

    Nothing of the above works for me The only workaround was to write a method

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

    and when using the AddLogging extension method write it as

    services.AddLogging( ConfigLogging );
    
    0 讨论(0)
  • 2020-12-29 02:58

    The way logging is configured has changed a little... The recommended way (and it's pretty well documented in this GitHub issue/announcement to do it now is to configure the loggers on the AddLogging method, such as

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

    And have an appsettings.json like

    Notice

    Seems a few people are confused, because the example only demonstrates the configuration of Console provider and not all loggers.

    The LogLevel section configures logging level for all namespaces (Default key) or for a specific namespace (System overrides the default value for all classes logging whose namespace starts with System.*.

    This is for the class used in T in ILogger<T>). This allows to set a higher or lower than default logging level for loggers from this namespace.

    {
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Information",
          "System": "Warning",
          "Microsoft": "Information"
        },
        "Console": {
          "LogLevel": {
            "Default": "Warning",
            "System": "Information",
            "Microsoft": "Information"
          }
        }
      }
    }
    

    Please note that the structure of the appsettings.json changed from what it used to be in .NET Core 1.x and that Logging entry in the appsettings.json now has logger provider names in it, which allows you to configure logging levels per logging provider.

    Previously, the entry in appsettings.json would only be applicable to the console logger.

    Alternatively, the logging can now be moved within the WebHostBuilder instead.

    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();
    }
    

    Update

    In case one doesn't want to use the appsettings.json, one can register the filters in code too.

    services.AddLogging(builder =>
    {
        builder.AddConfiguration(Configuration.GetSection("Logging"))
            // filter for all providers
            .AddFilter("System", LogLevel.Debug)
            // Only for Debug logger, using the provider type or it's alias
            .AddFilter("Debug", "System", LogLevel.Information)
            // Only for Console logger by provider type
            .AddFilter<DebugLoggerProvider>("System", LogLevel.Error)
            .AddConsole()
            .AddDebug();
    });
    
    0 讨论(0)
提交回复
热议问题