2017-05-28 29 views
8

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

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

谢谢。

+0

最后我提高微软记录并公布它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