记录器提供程序:如何实现自定义格式化程序

use*_*551 4 c# logging asp.net-core

我实现了自定义记录器提供程序。我的自定义记录器具有以下签名:

public void Log<TState>(LogLevel logLevel, EventId eventId, 
    TState state, Exception exception, Func<TState, Exception, string> formatter)
Run Code Online (Sandbox Code Playgroud)

如何formatter通过?

以及如何实现自定义formatter?说,如果我希望它格式化JSON中的所有内容

我是Net Core的新手,我并不完全了解它的工作原理。

pok*_*oke 5

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);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在这里生成JSON对象并不是什么神奇的事情。

  • 实际上,您不应该传递“异常”参数,因为默认格式化程序完全忽略它。请参阅 https://github.com/aspnet/Logging/issues/442。 (3认同)
  • @Métoule如果默认格式化程序忽略它,我不明白为什么这意味着你*不应该*通过它。它会被忽略,所以无论你是否通过它都没有关系。无论如何传递它都会使其与所有其他记录器保持一致。 (2认同)
  • 这演员阵容真是天赐之物!(状态为 IEnumerable&lt;KeyValuePair&lt;string, object&gt;&gt;) (2认同)