国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

[Asp.net 5] Logging-日志系統(tǒng)的基本架構(gòu)(下)

2019-11-17 02:08:53
字體:
供稿:網(wǎng)友

[asp.net 5] Logging-日志系統(tǒng)的基本架構(gòu)(下)

接上節(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。

  • FormattedLogValues:系統(tǒng)默認(rèn)擴(kuò)展傳入args以及formatter參數(shù)的擴(kuò)展方法使用,能夠?qū)凑說ormmater的格式,將對(duì)象串行成字符串(只支持以及數(shù)組)
  • ReflectionBasedLogValues:通過反射,獲取類的所有屬性。(該類會(huì)在擴(kuò)展log中使用)
    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

其他類

  • LogLevel:日志的等級(jí)
  • LogFormatter:與MessageFormatter類似,提供不同的formmater方法。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 开远市| 正阳县| 怀化市| 怀来县| 百色市| 滨州市| 长乐市| 天全县| 永清县| 江源县| 龙泉市| 象山县| 海林市| 鄂托克旗| 沂源县| 樟树市| 正定县| 万州区| 临安市| 湘西| 桑植县| 承德县| 抚顺县| 德江县| 元朗区| 平昌县| 山东| 桐乡市| 万全县| 伊吾县| 吴桥县| 山丹县| 馆陶县| 仁寿县| 天门市| 太谷县| 东乌珠穆沁旗| 鄄城县| 广丰县| 社旗县| 巴塘县|