Verwendung von Serilog in der .NET Core Console-App

8

Ich wollte, dass meine Anwendung in einer Datei protokolliert werden kann, und suchte nach mehr als dem Standard-Protokollierungsframework für .NET Core 2.2. Ich sehe, dass Serilog den Job machen könnte. Ich kann jedoch kein Dokument zum Einrichten von Serilog in der .NET Core Console-Anwendung mit Dependency Injection finden. Ich sehe nur ASP.NET-Materialien, was ich wahrscheinlich nicht brauche.

Ich habe es selbst gemacht. Ich habe (Nuget) installiert:

  • Serilog
  • Serilog.Extensions.Logging
  • Serilog.Sinks.File
  • Serilog.Sinks.Console (um Serilog für alle meine Protokollierungen zu verwenden)

Ich habe eine Erweiterung für erstelltServiceCollection

        public static void AddLogging(this IServiceCollection services, Microsoft.Extensions.Logging.LogLevel logLevel)
        {
            var serilogLogger = new LoggerConfiguration()
            .WriteTo.Console()
            .WriteTo.File("log.txt")
            .CreateLogger();

            services.AddLogging(builder =>
            {
                builder.SetMinimumLevel(logLevel);
                builder.AddSerilog(logger: serilogLogger, dispose: true);
            });
        }

Die Protokollierung funktioniert jedoch:

  • Die Protokollstufe ist nicht das, worauf ich sie eingestellt habe. Es scheint, dass Serilog das INFO-Level verwendet, obwohl ich DEBUG haben wollte. Warum wird meine Einstellung nicht respektiert? Immerhin verwende ich immer noch das Protokollierungsframework von NET Core, also verwende ich es zum Einrichten der Protokollierungsstufe
  • mache ich dieses Setup tatsächlich richtig? Ich bin mir nicht sicher, ob es so disposesein soll true. Im Allgemeinen möchte ich, dass das Dependency Injection Framework von NET Core die Entsorgung von Diensten übernimmt.
Loreno
quelle

Antworten:

3

Ich bin mir nicht sicher builder.SetMinimumLevel(es wird nicht die Serilog-Enumeration verwendet).

Wir legen die Logger-Ebene beim Erstellen des LoggerConfigurationObjekts fest.

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Debug) // restricted... is Optional
    (...)
    .CreateLogger();

Übrigens. Es lohnt sich, auf den folgenden Abschnitt aus den Konfigurationsgrundlagen hinzuweisen

Minimum von Logger vs. Senke - Es ist wichtig zu wissen , dass die Protokollierungsstufe nur für Spülen angehoben und nicht gesenkt werden kann. Wenn der MinimumLevel des Loggers auf Information festgelegt ist, werden in einer Senke mit Debug als angegebener Ebene weiterhin nur Ereignisse auf Informationsebene angezeigt. Dies liegt daran, dass die Konfiguration auf Logger-Ebene steuert, welche Protokollierungsanweisungen zur Erstellung von Ereignissen führen, während die Konfiguration auf Senkenebene nur diese filtert. Verwenden Sie eine separate LoggerConfiguration, um einen einzelnen Logger mit einer ausführlicheren Ebene zu erstellen.


Ich bin mir nicht sicher builder.AddSerilog.

Folgendes funktioniert bei mir.

using Serilog;

(...)

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    (...)
    .CreateLogger();

(...)

return new HostBuilder()
      .ConfigureHostConfiguration(...)
      .ConfigureServices(...)
      .UseSerilog();
Tymtam
quelle
Ihr erster Punkt zur Konfiguration gilt auch in meinem Fall. Die builder.SetMinimumLevelEinstellung hat eine höhere Priorität als die Einstellung von Serilog. Daher kann ich die ausführliche Protokollierung in Serilog und die tatsächlich gewünschte Stufe in der Microsoft-Protokollierung festlegen, um das zu erhalten, was ich benötige. Ich sehe, dass Sie sich in einer gehosteten Anwendung wie ASP.NET befinden. Wahrscheinlich verwenden Sie das Serilog.AspNetCore-Paket. In meinem Fall habe ich keinen Host.
Loreno