2017-06-09 75 views
0

我已經從.NET Core中的Microsoft.Extensions.Logging包中編寫了自己的ILogger實現,但是我不確定如何添加其他參數以進行記錄?自定義ILogger實現和額外/自定義字段?

目前,我有我的日誌方法如下簽名:

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

如何延長這個,所以我可以在額外的字段通過?這與TState參數有關嗎?

我在這裏發現了一個LoggerMessage.Define方法的一些附加信息,這裏聽起來像它可能是我正在尋找的東西,但似乎沒有太多的信息。

+0

[請不要把問題標題標籤(https://stackoverflow.com/help/tagging) – Liam

回答

1

如果你正在編寫接口的實現,你應該只依賴於接口(也許配置)。

要記錄的「字段」將由格式化程序確定。你可以在你的實現中調用它並記錄返回的字符串 - 如果提供的格式化程序爲空,你可以在你的實現中提供你自己的基本格式化程序。

更簡單的實現只會在狀態上調用ToString() - 或者做某種序列化並記錄結果。但是,這將消耗調用者的權力來確定正在記錄的內容。

一個調試記錄儀可以看起來像:

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))); 
    }