2017-05-28 14 views
8

.NET Coreコンソールアプリケーションでコンソールにログインするための組み込みのロギングプロバイダ(Microsoft.Extensions.Logging.Console)を使用しています。.NETコアロギングで出力フォーマットをフォーマットする方法はありますか?

各ロギングエントリは、出力に2行を生成します。私は1つの行に各エントリを持っていたいと思います。 出力形式をカスタマイズする方法はありますか?ここで

は、私はそれを使用する方法の例です:

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

最後に、私は、Microsoftのロガーを改善し、公表しますそれは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

関連する問題