自定义ILogger实现和额外/自定义字段?

时间:2017-06-09 10:52:37

标签: c# .net .net-core

我已经从.NET Core中的Microsoft.Extensions.Logging包编写了我自己的ILogger实现,但是我不确定如何添加要记录的其他参数?

目前我的日志方法有以下签名:

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

我如何扩展这个以便传递额外的字段?是否与TState参数有关?

我在这里找到了一些关于LoggerMessage.Define方法的其他信息here,听起来它可能就是我正在寻找的东西,但似乎没有太多的信息。

1 个答案:

答案 0 :(得分:1)

如果你正在编写接口的实现,你应该只依赖于接口(可能还有配置)。

要记录的“字段”将由格式化程序确定。您可以在实现中调用它并记录返回的字符串 - 如果提供的格式化程序为null,您可以在实现中提供自己的基本格式化程序。

更简单的实现只会在状态上调用ToString() - 或者执行某种序列化并记录结果。但是,这会从调用者那里获取权力来确定记录的内容。

Debug Logger看起来像这样:

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        formatter = formatter ?? ((o, ex) => string.Format("State: {0} - Exception: {1}", o, ex));
        Debug.WriteLine(this.Name + string.Format(" {0}: {1} - {2}", logLevel, eventId, formatter(state, exception)));
    }