Cómo usar Serilog en la aplicación .NET Core Console

8

Quería que mi aplicación tuviera la capacidad de iniciar sesión en un archivo, así que comencé a buscar algo más que el marco de registro predeterminado de .NET Core 2.2. Veo que Serilog podría hacer el trabajo. Sin embargo, no puedo encontrar ningún documento sobre cómo configurar Serilog en la aplicación .NET Core Console con Dependency Injection. Todo lo que veo son materiales ASP.NET, que probablemente no es lo que necesito.

Empecé a hacerlo yo mismo. Instalé (Nuget):

  • Serilog
  • Serilog.Extensions.Logging
  • Serilog.Sinks.File
  • Serilog.Sinks.Console (para usar Serilog para todos mis registros)

Creé una extensión paraServiceCollection

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

El registro funciona, sin embargo:

  • El nivel de registro no es lo que configuré. Parece que serilog está usando el nivel INFO, aunque quería tener DEBUG. ¿Por qué no se respeta mi entorno? Después de todo, todavía estoy usando el marco de registro de NET Core, así que lo estoy usando para configurar el nivel de registro
  • ¿Realmente estoy haciendo esta configuración correctamente? No estoy realmente seguro de si disposedebería ser true. En general, quiero que el marco de inyección de dependencia de NET Core se encargue de la eliminación de los servicios.
Loreno
fuente

Respuestas:

3

No estoy seguro builder.SetMinimumLevel(no usa la enumeración Serilog).

Establecemos el nivel del registrador al crear el LoggerConfigurationobjeto.

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

Por cierto. Vale la pena señalar la siguiente sección de Conceptos básicos de configuración

Mínimos de registrador frente a sumidero : es importante darse cuenta de que el nivel de registro solo puede aumentarse para sumideros, no reducirse. Por lo tanto, si el nivel mínimo del registrador se establece en Información, un sumidero con depuración ya que su nivel especificado solo verá eventos de nivel de información. Esto se debe a que la configuración de nivel de registrador controla qué declaraciones de registro generarán eventos, mientras que la configuración de nivel de sumidero solo los filtra. Para crear un único registrador con un nivel más detallado, use una Configuración de registrador separada.


No estoy seguro de eso builder.AddSerilog.

Esto es lo que funciona para mí.

using Serilog;

(...)

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

(...)

return new HostBuilder()
      .ConfigureHostConfiguration(...)
      .ConfigureServices(...)
      .UseSerilog();
tymtam
fuente
Su primer punto sobre la configuración es válido también en mi caso. El builder.SetMinimumLevelsettin tiene mayor prioridad que la configuración de Serilog. Entonces, puedo configurar el registro detallado en Serilog y el nivel real deseado en el registro de Microsoft para obtener lo que necesito. Veo que estás en alguna aplicación alojada, como ASP.NET. Probablemente esté utilizando el paquete Serilog.AspNetCore. En mi caso, no tengo ningún host.
Loreno