接上節(jié)內(nèi)容,我們繼續(xù)講解日志的其他部分.
ILoggerPRovider以及擴(kuò)展類
我們?cè)谏瞎?jié)的架構(gòu)圖上并沒有看到有直接實(shí)現(xiàn)該接口的實(shí)現(xiàn)類。那么如果將Logger類直接使用會(huì)有什么結(jié)果呢?
var factory = new LoggerFactory();var logger = factory.CreateLogger("name");logger.Log(LogLevel.Debug, 0, "state", null, null);這段代碼能夠正常運(yùn)行但是不會(huì)記錄任何日志。因?yàn)長ogger類并沒有直接記錄日志的功能,需要通過LoggerFactory的GetProviders方法創(chuàng)建能夠直接工作的ILogger類型日志。所以即使現(xiàn)在的工程中沒有對(duì)于ILoggerProvider的擴(kuò)展,但是我們可以預(yù)測:Microsoft.Framework.Logging.Console、Microsoft.Framework.Logging.NLog、Microsoft.Framework.Logging.TraceSource都會(huì)對(duì)ILoggerProvider進(jìn)行實(shí)現(xiàn),當(dāng)然由于ILoggerProvider會(huì)產(chǎn)生ILogger,所以他們也會(huì)實(shí)現(xiàn)ILogger類。ILogValues以及擴(kuò)展
我們看到日志記錄類的接口為:Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
該接口通過formatter將state和exception組合成字符串對(duì)象,然后記錄到log中。如果使用擴(kuò)展方法系統(tǒng)傳入的formatter永遠(yuǎn)是:MessageFormatter

private static string MessageFormatter(object state, Exception error) { if (state == null && error == null) { throw new InvalidOperationException("No message or exception details were found " + "to create a message for the log."); } if (state == null) { return error.ToString(); } if (error == null) { return state.ToString(); } return string.Format(CultureInfo.CurrentCulture, "{0}{1}{2}", state, Environment.NewLine, error); }MessageFormatter如果我們需要記錄的信息(state)比較復(fù)雜,是一個(gè)或多個(gè)復(fù)雜對(duì)象,那么我們一般使用ILogValues對(duì)象。
系統(tǒng)中一共為我們提供2個(gè)ILogValues接口實(shí)現(xiàn):FormattedLogValues、ReflectionBasedLogValues。

public class FormattedLogValues : ILogValues { private static ConcurrentDictionary<string, LogValuesFormatter> _formatters = new ConcurrentDictionary<string, LogValuesFormatter>(); private readonly LogValuesFormatter _formatter; private readonly object[] _values; public FormattedLogValues(string format, params object[] values) { _formatter = _formatters.GetOrAdd(format, f => new LogValuesFormatter(f)); _values = values; } public IEnumerable<KeyValuePair<string, object>> GetValues() { return _formatter.GetValues(_values); } public override string ToString() { return _formatter.Format(_values); } }FormattedLogValues
public class ReflectionBasedLogValues : ILogValues { public virtual IEnumerable<KeyValuePair<string, object>> GetValues() { var values = new List<KeyValuePair<string, object>>(); var properties = GetType().GetTypeInfo().DeclaredProperties; foreach (var propertyInfo in properties) { values.Add(new KeyValuePair<string, object>( propertyInfo.Name, propertyInfo.GetValue(this))); } return values; } }ReflectionBasedLogValues 其他類
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注