我已经从.NET Core中的Microsoft.Extensions.Logging包编写了我自己的ILogger实现,但是我不确定如何添加要记录的其他参数?
目前我的日志方法有以下签名:
public void Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter)
我如何扩展这个以便传递额外的字段?是否与TState参数有关?
我在这里找到了一些关于LoggerMessage.Define方法的其他信息here,听起来它可能就是我正在寻找的东西,但似乎没有太多的信息。
答案 0 :(得分:1)
如果你正在编写接口的实现,你应该只依赖于接口(可能还有配置)。
要记录的“字段”将由格式化程序确定。您可以在实现中调用它并记录返回的字符串 - 如果提供的格式化程序为null,您可以在实现中提供自己的基本格式化程序。
更简单的实现只会在状态上调用ToString()
- 或者执行某种序列化并记录结果。但是,这会从调用者那里获取权力来确定记录的内容。
Debug Logger看起来像这样:
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)));
}