Recientemente actualicé mi API REST de .NET Core de 3.1 a 6.0 . Cuando ejecuto la aplicación localmente sin Docker en la configuración de desarrollo o versión, los registros se formatean como siempre:
Al ejecutar la aplicación como contenedor de Docker, los registros se transforman en JSON . Esto apareció después de la migración a .Net 6.
¿Cómo puedo volver al formato de registro estándar en el entorno de Docker?
El cambio se realizó en .NET 5, no en 6. En .NET Core 3.1, se corrigió el formato de registro de la consola. En .NET 5 , ahora se puede personalizar con 3 formateadores predefinidos: Simple (el antiguo), Systemd y Json (el predeterminado). Es posible crear un formateador personalizado.
Como muestran los documentos, es posible usar el formateador simple usando el método AddSimpleConsole en lugar de AddConsole :
using ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddSimpleConsole(options => { options.IncludeScopes = true; options.SingleLine = true; options.TimestampFormat = "hh:mm:ss "; })); Existen métodos similares para los otros dos formateadores: AddSystemdConsole y AddJsonConsole .
Es posible configurar el formateador a través de la configuración :
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" }, "Console": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" }, "FormatterName": "json", "FormatterOptions": { "SingleLine": true, "IncludeScopes": true, "TimestampFormat": "HH:mm:ss ", "UseUtcTimestamp": true, "JsonWriterOptions": { "Indented": true } } } }, "AllowedHosts": "*" } Finalmente, es posible crear un formateador completamente nuevo al heredar de ConsoleFormatter y anular el método Write :
public sealed class CustomFormatter : ConsoleFormatter, IDisposable { ... public override void Write<TState>( in LogEntry<TState> logEntry, IExternalScopeProvider scopeProvider, TextWriter textWriter) { string? message = logEntry.Formatter?.Invoke( logEntry.State, logEntry.Exception); if (message is null) { return; } CustomLogicGoesHere(textWriter); textWriter.WriteLine(message); } ... }