web-dev-qa-db-fra.com

Existe-t-il un moyen de formater le format de sortie dans la journalisation .NET Core?

J'utilise le fournisseur de journalisation intégré pour la connexion à la console (Microsoft.Extensions.Logging.Console) dans une application console .NET Core.

Chaque entrée de journalisation produit deux lignes dans la sortie. Je voudrais avoir chaque entrée dans une seule ligne . Y at-il un moyen de personnaliser le format de sortie?

Voici un exemple de comment je l'utilise:

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

Ce que je reçois c'est:

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

Ce que j'aimerais avoir est quelque chose comme ceci:

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

Une idée? Je sais que je pourrais écrire un enregistreur personnalisé, mais j'aimerais savoir s'il existe un autre moyen.

Merci.

18
BooFar

Pour le moment, ce n'est pas configurable. Le code source est ici sur GitHub :

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

Si vous le souhaitez, vous devez écrire votre propre enregistreur. Cependant, vous pouvez simplement copier le code source du consignateur de la console, le modifier à votre guise et modifier les espaces de noms afin qu'il n'interfère pas avec la version fournie par Microsoft.

Vous pouvez également ouvrir un problème sur le référentiel de journalisation pour demander cette option.

8
Martin Ullrich

Comme @MartinUllrich l'a déjà mentionné, ce saut de ligne ne peut pas être désactivé et vous devez implémenter un enregistreur personnalisé pour l'éviter. 

Enregistrement:

loggerFactory.AddProvider(new CustomLoggerProvider());

L'implémentation (peut être étendue à l'aide de l'original ConsoleLogger code source - par exemple, vous pouvez ajouter la méthode 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;
        }
    }
}
6
Ilya Chumakov

Vous pouvez utiliser une bibliothèque de journalisation telle que Serilog.

En utilisant les instructions de Intégration ASP.NET Core , vous pourrez simplement fournir ultérieurement un modèle de sortie de journalisation via le Console sink

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