net log asp c# logging console-application .net-core

c# - asp - ¿Hay alguna forma de formatear el formato de salida en.NET Core logging?



nlog net core (3)

Estoy utilizando el proveedor de registro integrado para iniciar sesión en la consola ( Microsoft.Extensions.Logging.Console ) en una aplicación de consola .NET Core.

Cada entrada de registro produce dos líneas en la salida. Me gustaría tener cada entrada en una sola línea. ¿Hay alguna manera de personalizar el formato de salida?

Aquí hay un ejemplo de cómo lo uso:

static void Main(string[] args) { var serviceProvider = new ServiceCollection() .AddLogging() // This adds the Microsoft logging. .AddSingleton<IProjectGeneratorService, CSharpProjectGeneratorService>() .BuildServiceProvider(); // Configure the console logging. serviceProvider .GetService<ILoggerFactory>() .AddConsole(LogLevel.Debug); // Write a logging entry var logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<Program>(); logger.LogDebug("Application started..."); }

Lo que obtengo es:

dbug: Generator.Program[0] Application started...

Lo que me gustaría tener es algo como esto:

dbug: Generator.Program[0]: Application started...

¿Alguna idea? Lo sé, podría escribir un registrador personalizado, pero me gustaría saber si hay otra manera.

Gracias.


Como @MartinUllrich ya mencionó, este salto de línea no se puede desactivar y debe implementar un registrador personalizado para evitarlo.

Registro:

loggerFactory.AddProvider(new CustomLoggerProvider());

La implementación (se puede ampliar con el uso del código fuente original de ConsoleLogger , por ejemplo, podría agregar el método GetLogLevelConsoleColors ):

public class CustomLoggerProvider : ILoggerProvider { public void Dispose() { } public ILogger CreateLogger(string categoryName) { return new CustomConsoleLogger(categoryName); } public class CustomConsoleLogger : ILogger { private readonly string _categoryName; public CustomConsoleLogger(string categoryName) { _categoryName = categoryName; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { if (!IsEnabled(logLevel)) { return; } Console.WriteLine($"{logLevel}: {_categoryName}[{eventId.Id}]: {formatter(state, exception)}"); } public bool IsEnabled(LogLevel logLevel) { return true; } public IDisposable BeginScope<TState>(TState state) { return null; } } }


Por el momento, esto no es configurable. El código fuente está aquí en GitHub :

logBuilder.Append(logName); logBuilder.Append("["); logBuilder.Append(eventId); logBuilder.AppendLine("]");

Si quieres eso, necesitas escribir tu propio registrador. Sin embargo, solo puede copiar el código fuente del registrador de la consola, modificar según sea necesario y cambiar los espacios de nombres para que no interfiera con la versión que Microsoft envía.

También puede abrir un problema en el repositorio de registro para solicitar esta opción.


Puede utilizar una biblioteca de registro como Serilog.

Utilizando las instrucciones de la integración de ASP.NET Core , puede proporcionar una plantilla de salida de registro a través del receptor de la consola.

.WriteTo.Console( outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")