我实现了自定义记录器提供程序。我的自定义记录器具有以下签名:
public void Log<TState>(LogLevel logLevel, EventId eventId,
TState state, Exception exception, Func<TState, Exception, string> formatter)
formatter
如何通过?
如何实施自定义formatter
?比方说,如果我希望它在JSON中格式化所有内容
我是Net Core的新手,我不完全了解它是如何工作的。
答案 0 :(得分:3)
传递给函数的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
});
// store the JSON log message somewhere
Console.WriteLine(jsonLine);
}
正如您所看到的,在这里生成JSON对象并不是那么神奇。
答案 1 :(得分:1)
首先,这与.NET Core没有任何关系。看起来您正在使用Microsoft.Extensions.Logging
,这只是一个通用的日志记录,您可以在任何地方使用.NET Core应用程序。它恰好是ASP.NET核心应用程序使用的默认值;这就是全部。
其次,如果您不知道如何实现此方法,那么创建自己的日志记录提供程序可能不是一个好主意。您尝试做的是什么,那里还没有现有的适配器?
也就是说,Func<TState, Exception, string>
类型意味着它需要一个接受TState
类型参数和类型Exception
之一的函数并返回一个字符串。基本上:
public string MyFormatter<TState>(TState state, Exception exception)
{
// create some string
return someString;
}
或者,它可以通过lambda实现:
(state, exception) => exception?.Message ?? state.ToString();