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

时间:2017-10-26 12:28:27

标签: c# logging asp.net-core

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

public void Log<TState>(LogLevel logLevel, EventId eventId, 
    TState state, Exception exception, Func<TState, Exception, string> formatter)

formatter如何通过?

如何实施自定义formatter?比方说,如果我希望它在JSON中格式化所有内容

我是Net Core的新手,我不完全了解它是如何工作的。

2 个答案:

答案 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();