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