作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我实现了一个自定义记录器提供程序。我的自定义记录器具有以下签名:
public void Log<TState>(LogLevel logLevel, EventId eventId,
TState state, Exception exception, Func<TState, Exception, string> formatter)
formatter
是如何传递的?
如何实现自定义格式化程序
?假设我希望它以 JSON 格式格式化所有内容
我是 Net Core 新手,我不完全理解它是如何工作的。
最佳答案
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 对象并没有那么神奇。
关于c# - 记录器提供程序 : How can I implement a custom formatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46954352/
我是一名优秀的程序员,十分优秀!