我使用内置日志记录提供程序登录.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...
有什么想法吗?我知道,我可以写一个自定义记录器,但我想知道是否还有其他方法。
感谢。
答案 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