传递给你的函数的
Func<TState, Exception, string> formatter
函数基本上是一个实用函数,用于将状态转换为单个字符串消息。在你的记录器内部,你基本上只需要调用
formatter(state, exception)
来获取应该被记录的格式化消息。
通常情况下,你不需要关心这个函数,除了调用它以获取格式化的消息之外,所以所有的日志记录器通常都会这样做。对于JSON记录器,你可以完全忽略它,或者至少也导出格式化后的消息,以便作为可读的字符串存在。
一个快速而简单的JSON记录器的
Log
方法实际上可能看起来像这样:
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
var jsonLine = JsonConvert.SerializeObject(new {
logLevel,
eventId,
parameters = (state as IEnumerable<KeyValuePair<string, object>>)?.ToDictionary(i => i.Key, i => i.Value),
message = formatter(state, exception),
exception = exception?.GetType().Name
});
Console.WriteLine(jsonLine);
}
你可以看到,在这里生成 JSON 对象并不是很神奇。
exception
参数,因为默认的格式化程序会完全忽略它。请参见 https://github.com/aspnet/Logging/issues/442。 - Métoule