web-dev-qa-db-de.com

Gibt es eine Möglichkeit, das Ausgabeformat in der .NET Core-Protokollierung zu formatieren?

Ich verwende den integrierten Protokollierungsanbieter zum Anmelden an der Konsole (Microsoft.Extensions.Logging.Console) in einer .NET Core-Konsolenanwendung.

Jeder Protokolleintrag erzeugt zwei Zeilen in der Ausgabe. Ich möchte, dass jeder Eintrag in einer einzigen Zeile angezeigt wird. Gibt es eine Möglichkeit, das Ausgabeformat anzupassen?

Hier ein Beispiel, wie ich es benutze:

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

Was ich bekomme ist:

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

Was ich gerne hätte, ist ungefähr so:

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

Irgendeine Idee? Ich weiß, ich könnte einen benutzerdefinierten Logger schreiben, aber ich würde gerne wissen, ob es einen anderen Weg gibt.

Vielen Dank.

18
BooFar

Im Moment ist dies nicht konfigurierbar. Der Quellcode ist hier auf GitHub :

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

Wenn Sie das wollen, müssen Sie Ihren eigenen Logger schreiben. Sie können jedoch nur den Quellcode des Konsolenloggers kopieren, nach Bedarf ändern und die Namespaces ändern, damit die Version, die von Microsoft geliefert wird, nicht beeinträchtigt wird.

Sie können auch eine Ausgabe im Logging-Repo öffnen, um diese Option anzufordern.

8
Martin Ullrich

Wie @MartinUllrich bereits erwähnt hat, kann dieser Zeilenumbruch nicht deaktiviert werden. Sie müssen einen benutzerdefinierten Logger implementieren, um dies zu vermeiden. 

Anmeldung:

loggerFactory.AddProvider(new CustomLoggerProvider());

Die Implementierung (kann mit dem ursprünglichen ConsoleLogger Quellcode erweitert werden - beispielsweise können Sie die GetLogLevelConsoleColors-Methode hinzufügen):

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;
        }
    }
}
6
Ilya Chumakov

Sie können eine Protokollbibliothek wie Serilog verwenden.

Mit den Anweisungen aus der ASP.NET Core-Integration können Sie später einfach eine Protokollausgabevorlage über die Console-Senke bereitstellen

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