it-swarm.com.de

Ist die Protokollierung von .NET Core 2.0 fehlerhaft?

Nach dem Upgrade auf .NET Core 2.0 (+ ASP.NET Core 2.0) scheint es nicht möglich zu sein, Protokollinformationen auf Trace-Ebene auszugeben.

Wenn ich ein dotnet new web-Projekt durchführe und den folgenden Code in Startup for Configure hinzufüge, erhalte ich keine Trace- oder Debug-Protokollnachrichten, ich erhalte jedoch zweimal die Informations- und Fehlermeldungen. Wenn Sie .AddConsole()call auskommentieren, werden diese Informationen (Information und Fehler) nur einmal ausgegeben. Dies legt den Schluss nahe, dass dieser standardmäßig automatisch mit einem Konsolenanbieter konfiguriert wird. Denken Sie daran, dies ist ein "File -> New" -Projekterlebnis. In Program.cs gibt es dafür keinerlei Einstellungen für die Protokollierung oder Konfiguration - außer für das, was ich hinzugefügt habe. Hat jemand Dinge gesehen? Oder sollte ich ein GitHub-Problem dafür registrieren?.

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!");
    });
}
27
EinarI

Die Art und Weise, wie die Protokollierung konfiguriert wird, hat sich ein wenig geändert. Die empfohlene Art und Weise (und dies ist in diesem GitHub-Problem/Ankündigung ziemlich gut dokumentiert.) Jetzt müssen Sie die Logger für die AddLogging-Methode konfigurieren, z. B. 

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

Und habe einen appsettings.json gefällt 

Beachten

Anscheinend sind einige Leute verwirrt, da das Beispiel nur die Konfiguration von Console Provider und nicht alle Logger veranschaulicht.

Der Abschnitt LogLevel konfiguriert die Protokollierungsstufe für alle Namespaces (Default-Schlüssel) oder für einen bestimmten Namespace (System) überschreibt den Standardwert für alle Protokollierungsklassen, deren Namespace mit System.* beginnt.

Dies ist für die in T in ILogger<T>) verwendete Klasse. Dies ermöglicht das Festlegen einer höheren oder niedrigeren als die Standardprotokollierungsstufe für Protokollierer aus diesem Namespace. 

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

Beachten Sie, dass sich die Struktur von appsettings.json von der früheren Version von .NET Core 1.x geändert hat und dass der Eintrag Logging in appsettings.json jetzt Logger-Provider-Namen enthält, mit denen Sie die Protokollierebenen pro Logging-Provider konfigurieren können. 

Bisher war der Eintrag in appsettings.json nur für den Konsolenlogger gültig.

Alternativ kann die Protokollierung stattdessen jetzt in WebHostBuilder verschoben werden. 

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

Aktualisieren

Falls Sie den appsettings.json nicht verwenden möchten, können Sie die Filter auch im Code registrieren. 

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

Ich habe fast zwanzig Minuten gebraucht, um zu realisieren, dass Configuration.GetSection("Logging") in der Datei Startup.cs den Abschnitt "Logging" aus der Konfiguration in der Datei appsettings.json liest, die als "Error" konfiguriert wurde. Das Ändern des Codes in "Information" oder etwas niedriger wurde behoben.

So sieht die Datei appsettinsg.json jetzt aus:

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

Weitere Informationen zu den Protokollierungsstufen (z. B. in "Information") finden Sie unter this link, der auch allgemeine Informationen zur ASP.NET Core-Protokollierung enthält.

Ich poste gerade hier, nur für den Fall, dass Sie Probleme mit der Protokollierung haben, stellen Sie sicher, dass Sie diese JSON-Datei durchlaufen haben.

8
Shimmy

Nichts von dem oben genannten funktioniert für mich. Die einzige Problemumgehung bestand darin, eine Methode zu schreiben

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

und bei Verwendung der AddLogging-Erweiterungsmethode schreiben Sie es als

services.AddLogging( ConfigLogging );
4
Panos Theof

Die folgende Struktur von appsettings.json scheint gut zu funktionieren:

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

Entnommen aus https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

Sehen Sie auch, was Ihre Startaufrufe sind. Ich finde folgende Arbeiten für mich:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {

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

        Log.Logger = logger;
    }
}
0
Art