web-dev-qa-db-ja.com

.NET Coreロギングで出力形式をフォーマットする方法はありますか?

コンソールへのログインに組み込みのロギングプロバイダーを使用しています(Microsoft.Extensions.Logging.Console).NET Coreコンソールアプリケーション。

各ロギングエントリは、出力に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...

何か案が?カスタムロガーを書くことはできますが、他の方法があるかどうか知りたいです。

ありがとう。

27
BooFar

現時点では、これは構成できません。ソースコード GitHubにあります

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

それが必要な場合は、独自のロガーを作成する必要があります。ただし、コンソールロガーのソースコードをコピーし、必要に応じて変更し、ネームスペースを変更するだけで、Microsoftが出荷するバージョンに干渉することはありません。

ロギングリポジトリの問題 を開いて、このオプションを要求することもできます。

11
Martin Ullrich

@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;
        }
    }
}
12
Ilya Chumakov

Serilogのようなロギングライブラリを使用できます。

ASP.NET Core統合 からの指示を使用して、後で Console sink を介してログ出力テンプレートを簡単に提供できます。

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