Microsoft.Extensions.Logging
当我想存储一个短(<200 个字符)参数化字符串时,我的 ASP.NET Core 2.x Web 应用程序习惯性地使用它来执行“跟踪”式日志记录。这些记录的事件与围绕 Serilog 等结构化日志系统构建的工具和生态系统配合得很好。
例如
public IActionResult DisplayCustomers(String customerName, String country)
{
this.logger.LogInformation( "Search performed for customers named {name} in {country}.", customerName, country );
}
StringBuilder
但是,我的应用程序还需要记录由应用程序使用以及由第三方组件生成的类似文本块构建的较大的文本块 (2-3KB) ,通常这些会消耗IProgress<String>
该输出许多短字符串值的方式类似于临时使用Console.WriteLine
.
例如
// Backend method (no structured logging available):
public void ProcessData(LotsOfData data, IProgress<String> report)
{
Stopwatch sw = Stopwatch.StartNew();
for( Int32 i = 0; i < data.Records.Count; i++ )
{
if( i % 500 == 0 ) report.Report( String.Format( "{0}ms - Processed {1} records.", sw.ElapsedMilliseconds, i ) );
if( data.Records[i].Foo )
{
// (send job off to SQL Server and get back SPROC output via PRINT and RAISERROR)
String sprocRaiseErrorOutput = ...
report.Report( "Sproc output: " + sprocRaiseErrorOutput );
}
if( data.Records[i].Bar ) report.Report( "Contents of bar: " + data.Records[i].Bar.Text );
}
report.Report( "{0}ms - Completed.", sw.ElapsedMilliseconds );
}
class StringBuilderProgress : IProgress<String>
{
private StringBuilder sb;
public StringBuilderProgress(StringBuilder sb) { this.sb = sb; }
public void Report(String value) { this.sb.AppendLine( value ); }
}
// Frontend method:
public IActionResult ProcessData(LotsOfData data)
{
StringBuilder sb = new StringBuilder();
StringBuilderProgress sbp = new StringBuilderProgress( sb );
backendService.ProcessData( data, sbp );
this.logger.LogInformation( "Process data ran: {report}", sb.ToString() );
}
...这会产生一个包含有用信息并且需要单独查看的大型非结构化文本 blob,但它不适合现有的结构化日志记录工具。
ILogger
我认识到一个通用的解决方案是为该实现编写一个包装器IProgress<String>
- 但这种方法存在一些问题:
- 原始文本块中的每个输出行都成为一个结构化对象,受其自身的附加属性的限制,这些属性会显着增加日志的大小。
- 这会导致重复数据,例如结构化日志系统会添加时间戳,但文本也已经包含秒表时间值。
- 通常,文本 blob 包含诸如用于框和指示处理区域的 ACII-art 之类的内容,并且每行缩进以表示更深层次的处理 - 如果每行单独存储且独立于其文本上下文,则此信息将丢失。
- 只包含 ASCII 艺术矩形框的第一行的日志条目有什么用?
Serilog 或 MEL 中是否有专门处理文本 blob 的方法?比如将它们输出到自己的文件中?