2017-06-09 45 views
0

我已经从.NET Core中的Microsoft.Extensions.Logging包中编写了自己的ILogger实现,但是我不确定如何添加其他参数以进行记录?自定义ILogger实现和额外/自定义字段?

目前,我有我的日志方法如下签名:

public void Log<TState>(
     LogLevel logLevel, 
     EventId eventId, 
     TState state, 
     Exception exception, 
     Func<TState, Exception, string> formatter) 

如何延长这个,所以我可以在额外的字段通过?这与TState参数有关吗?

我在这里发现了一个LoggerMessage.Define方法的一些附加信息,这里听起来像它可能是我正在寻找的东西,但似乎没有太多的信息。

+0

[请不要把问题标题标签(https://stackoverflow.com/help/tagging) – Liam

回答

1

如果你正在编写接口的实现,你应该只依赖于接口(也许配置)。

要记录的“字段”将由格式化程序确定。你可以在你的实现中调用它并记录返回的字符串 - 如果提供的格式化程序为空,你可以在你的实现中提供你自己的基本格式化程序。

更简单的实现只会在状态上调用ToString() - 或者做某种序列化并记录结果。但是,这将消耗调用者的权力来确定正在记录的内容。

一个调试记录仪可以看起来像:

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) 
    { 
     formatter = formatter ?? ((o, ex) => string.Format("State: {0} - Exception: {1}", o, ex)); 
     Debug.WriteLine(this.Name + string.Format(" {0}: {1} - {2}", logLevel, eventId, formatter(state, exception))); 
    }