2017-12-14 6 views
2

Ist es möglich, das Datum und die Uhrzeit im Konsolenprotokoll eines asp.net Core 2.0-Projekts für die Produktions- und Entwicklungsumgebung anzugeben?Datum und Uhrzeit im Konsolenprotokoll

Ich habe folgende in meinem Start:

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

Appsettings.json:

"LoggingDevelopment": { 
    "IncludeScopes": false, 
    "Console": { 
     "LogLevel": { 
     "Default": "Debug", 
     "System": "Information", 
     "Microsoft": "Information" 
     } 
    } 
    }, 
    "LoggingProduction": { 
    "IncludeScopes": false, 
    "Console": { 
     "LogLevel": { 
     "Default": "Error", 
     "System": "Error", 
     "Microsoft": "Error" 
     } 
    } 
    }, 

Aktuelle [Entwicklung] log Layout (ohne Datum oder die Uhrzeit der Protokollzeile):

info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] 
     Executed action a.Controller (project) in 531.2457ms 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 
     Request finished in 532.5812ms 200 text/html; charset=utf-8 

Im Produktionsmodus für Fehlerzeilen wäre ein Datum und eine Uhrzeit äußerst praktisch.

+1

Diese könnte nützlich sein: https://github.com/aspnet/Logging/issues/483. –

Antwort

2

Standardkonsole Logger ist ziemlich begrenzt. Natürlich gibt es immer die Möglichkeit, Lambda-Formatierer zu verwenden, wie in Github-Ausgabe von serpent5 angegeben. Aber es ist nur zugänglich, wenn rohe ILogger.Log() Methode verwendet wird. Es ist nicht verfügbar für ILogger Erweiterungen wie LogInformation oder LogError. Diese Option ist auch nicht verfügbar, wenn Sie den Protokollierungsaufruf nicht steuern. Es ist tatsächlich Ihr Fall, wenn die Protokollierung von internen Klassen von ASP.NET Core durchgeführt wird.

Sie brauchen also eine flexiblere Implementierung von Logger für .Net Core. Ich schlage vor, Serilog zu verwenden. Es ist ziemlich einfach, aber gleichzeitig sehr flexibel und leistungsstark.

  1. Installieren Sie folgende NuGet Pakete:

    Serilog.AspNetCore

    Serilog.Sinks.Console

    Neben Konsole Serilog unterstützt viele andere

    Um Serilog in ASP.Net Core-Anwendung gehen Sie wie folgt zu integrieren Ziele wie Rolling File, E-Mail, SQL Server, usw. Siehe diese Liste von anderen Serilog targets.

  2. konfigurieren Serilog beim Anwendungsstart:

ist hier ein Beispiel:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Log.Logger = new LoggerConfiguration() 
      .MinimumLevel.Debug() 
      .MinimumLevel.Override("Microsoft", LogEventLevel.Information) 
      .Enrich.FromLogContext() 
      .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}") 
      .CreateLogger(); 

     BuildWebHost(args).Run(); 
    } 

    public static IWebHost BuildWebHost(string[] args) => 
     WebHost.CreateDefaultBuilder(args) 
      .UseStartup<Startup>() 
      .UseSerilog() 
      .Build(); 
} 

bereitgestellt Ausgabevorlage eingeloggte Nachricht Datum und Uhrzeit ergänzt:

enter image description here

+0

Ist es eine Möglichkeit, den Loglevel basierend auf der Umgebung (in serilog) zu setzen: also für die Produktion minimalen Fehler und für die Entwicklung minimale Informationen? – Wouter

+2

Sicher. Sie können diesen Unterschied beispielsweise in 'appsettings. {Env.EnvironmentName} .json' angeben und den Wert an' MinimumLevel.Override ("Microsoft", LogEventLevel.Information) 'übergeben. Serilog unterstützt auch das Laden der gesamten Konfiguration aus einer Datei. Überprüfen Sie dies für Details: https://github.com/serilog/serilog-settings-configuration – CodeFuller