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

时间:2017-05-28 17:58:42

标签: c# logging console-application .net-core

我使用内置日志记录提供程序登录.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...

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

感谢。

6 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:4)

尽管您不能指定自己的自定义格式,但它确实支持另一种“ systemd”格式,您可以像这样选择:

init()

这将在一行中输出每个日志条目,即使您的文本中包含换行符(因此例外情况也不是很漂亮)。它还不使用颜色,如果您重定向到文件,这将是一个优势。

答案 3 :(得分:1)

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

使用ASP.NET Core integration中的说明,稍后您只需通过Console sink

提供日志记录输出模板
.WriteTo.Console(
    outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")

答案 4 :(得分:1)

现在使用 SimpleConsoleFormatter 包中的 Microsoft.Extensions.Logging.Console 5.0.0 很容易做到这一点。

SimpleConsoleFormatter 的源代码是 here on Github

示例:

static void Main(string[] args)
{
      var serviceProvider = new ServiceCollection()
            .AddLogging(loggingBuilder => loggingBuilder
                .AddSimpleConsole(formatterOptions =>
                {
                    formatterOptions.SingleLine = true;
                })
                .SetMinimumLevel(LogLevel.Debug))
            .BuildServiceProvider();

      // Write a logging entry
      var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
      logger.LogDebug("Application started...");
}

输出:

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

答案 5 :(得分:0)

这已在.NET 5:https://docs.microsoft.com/en-us/dotnet/core/extensions/console-log-formatter中更新。现在提供简单的systemd和json