有没有办法在.NET Core日志记录中格式化输出格式?

问题描述 投票:22回答:3

我正在使用内置的日志记录提供程序登录到.NET Core控制台应用程序中的控制台(Microsoft.Extensions.Logging.Console)。

每个日志记录条目在输出中生成两行。我想将每个条目放在一行中。有没有办法自定义输出格式?

以下是我如何使用它的示例:

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...

任何的想法?我知道,我可以写一个自定义记录器,但我想知道是否还有其他方法。

谢谢。

c# logging console-application .net-core
3个回答
11
投票

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

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

如果你想要,你需要编写自己的记录器。但是,您只需复制控制台记录器的源代码,根据需要进行修改并更改名称空间,以免影响Microsoft提供的版本。

您也可以打开issue on the logging repo来询问此选项。


9
投票

正如@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;
        }
    }
}

1
投票

您可以使用像Serilog这样的日志库。

使用ASP.NET Core integration中的说明,您可以稍后通过Console sink提供日志输出模板

.WriteTo.Console(
    outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
© www.soinside.com 2019 - 2024. All rights reserved.