2017-05-28 4 views
8

J'utilise le fournisseur de journalisation intégré pour se connecter à la console (Microsoft.Extensions.Logging.Console) dans une application console .NET Core.Existe-t-il un moyen de formater le format de sortie dans la journalisation Core .NET?

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

Voici un exemple que 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 est:

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

Ce que je voudrais avoir est quelque chose comme ceci:

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

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

Merci.

+0

Enfin, j'amélioré enregistreur Microsoft et publié il https://github.com/ilya-chumakov/LoggingAdvanced. À l'aide de ce package, il est possible de supprimer un saut de ligne entre les parties de message. De plus, j'ai ajouté une autre fonctionnalité de tueur - un horodatage! –

Répondre

4

À l'heure actuelle, ce ne peut être configuré. Le code source is here on GitHub:

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

Si vous voulez, vous devez écrire votre propre enregistreur. Cependant, vous pouvez simplement copier le code source de l'enregistreur de console, le modifier si nécessaire et modifier les espaces de noms afin qu'il n'interfère pas avec la version de Microsoft.

Vous pouvez également ouvrir un issue on the logging repo pour demander cette option.

+0

Ok, je pensais que ce serait le seul moyen. Merci pour les liens et l'extrait de code. Cela m'a fait gagner du temps à chercher moi-même :-) – BooFar

2

Comme @MartinUllrich déjà mentionné cette ligne ne peut pas être désactivée et vous devez mettre en œuvre un enregistreur personnalisé pour l'éviter.

Inscription:

loggerFactory.AddProvider(new CustomLoggerProvider()); 

La mise en œuvre (peut être étendue à l'utilisation du code source ConsoleLogger d'origine - 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; 
     } 
    } 
} 
+0

Hey Ilya, merci beaucoup pour l'exemple. – BooFar