Подтвердить что ты не робот

Есть ли способ форматировать выходной формат в ведении .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...

Любая идея? Я знаю, я мог бы написать собственный регистратор, но я хотел бы знать, есть ли другой способ.

Спасибо.

4b9b3361

Ответ 1

На данный момент это не настраивается. Исходный код здесь на GitHub:

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

Если вы хотите этого, вам нужно написать свой собственный регистратор. Однако вы можете просто скопировать исходный код консольного логгера, изменить его по мере необходимости и изменить пространства имен, чтобы он не мешал версии, поставляемой Microsoft.

Вы также можете открыть вопрос в журнале репо, чтобы попросить эту опцию.

Ответ 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;
        }
    }
}

Ответ 3

Вы можете использовать библиотеку журналов, как Serilog.

Используя инструкции по интеграции с ASP.NET Core, вы можете позже просто предоставить шаблон вывода журнала через консольный приемник.

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