2017-05-28 20 views
8

Używam wbudowanego dostawcy rejestrowania do logowania się do konsoli (Microsoft.Extensions.Logging.Console) w aplikacji konsoli .NET Core.Czy istnieje sposób formatowania formatu wyjściowego w protokołowaniu .NET Core?

Każde wpisanie do dziennika powoduje utworzenie dwóch wierszy na wyjściu. Chciałbym, aby każdy wpis był w jednym wierszu. Czy istnieje sposób na dostosowanie formatu wyjściowego?

Oto przykład, jak go używać:

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

Co pojawia się:

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

Co chciałbym mieć to coś takiego:

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

Dowolny pomysł? Wiem, że mógłbym napisać własny rejestrator, ale chciałbym wiedzieć, czy jest inny sposób.

Dzięki.

+0

W końcu poprawił Microsoft rejestratora i opublikowane to https://github.com/ilya-chumakov/LoggingAdvanced. Za pomocą tego pakietu można usunąć podział wiersza między częściami wiadomości. Co więcej, dodałem kolejną cechę zabójcy - znacznik czasu! –

Odpowiedz

4

W tej chwili nie można tego skonfigurować. Kod źródłowy is here on GitHub:

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

Jeśli chcesz, że trzeba napisać własny rejestrator. Możesz jednak po prostu skopiować kod źródłowy rejestratora konsoli, zmodyfikować go w razie potrzeby i zmienić przestrzenie nazw, aby nie kolidował z wersją dostarczaną przez firmę Microsoft.

Możesz także otworzyć issue on the logging repo, aby poprosić o tę opcję.

+0

Ok, myślałem, że to będzie jedyny sposób. Dziękuję za linki i fragment kodu. Oszczędziłam czas na szukanie samemu :-) – BooFar

2

Jak już wspomniałem @MartinUllrich, ten podział linii nie może być wyłączony i trzeba zaimplementować niestandardowy rejestrator, aby tego uniknąć.

Rejestracja:

loggerFactory.AddProvider(new CustomLoggerProvider()); 

Realizacja (może być przedłużony z użyciem oryginalnego kodu ConsoleLogger źródła - na przykład, można dodać GetLogLevelConsoleColors metody):

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

Hej Ilya, bardzo dziękuję za ten przykład. – BooFar

Powiązane problemy