2017-05-28 28 views
8

我正在使用內置日誌記錄提供程序登錄到.NET Core控制檯應用程序中的控制檯(Microsoft.Extensions.Logging.Console)。有沒有在.NET Core日誌中格式化輸出格式的方法?

每個日誌條目在輸出中產生兩行。我希望每條記錄都在一行中。 有沒有辦法自定義輸出格式?

下面是一個例子,我如何使用它:

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

我得到的是:

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

我想什麼有是這樣的:

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

任何想法?我知道,我可以寫一個自定義記錄器,但我想知道是否有其他方法。

謝謝。

+0

最後我提高微軟記錄並公佈它https://github.com/ilya-chumakov/LoggingAdvanced。使用該包,可以刪除消息部分之間的換行符。而且,我添加了另一個殺手功能 - 時間戳! –

回答

4

目前,這是不可配置的。源代碼is here on GitHub

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

如果你想要的,你需要編寫自己的記錄。但是,您可以複製控制檯日誌記錄器的源代碼,根據需要進行修改並更改命名空間,以免干擾Microsoft發佈的版本。

您也可以打開issue on the logging repo來詢問這個選項。

+0

好吧,我認爲這將是唯一的方法。感謝您的鏈接和代碼片段。這節省了我自己搜索的時間:-) – BooFar

2

由於@MartinUllrich已經提到這個換行符不能被禁用,你必須實現一個自定義記錄器來避免它。

報名:

loggerFactory.AddProvider(new CustomLoggerProvider()); 

實現(可以使用原來的ConsoleLogger源代碼進行擴展 - 例如,你可以添加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

嗨伊利亞,非常感謝這個例子。 – BooFar