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

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

[Asp.net 5] Logging-其他日志系統(tǒng)的實(shí)現(xiàn)

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

[asp.net 5] Logging-其他日志系統(tǒng)的實(shí)現(xiàn)

Microsoft.Framework.Logging.NLog

使用Nlog擴(kuò)展日志系統(tǒng):按照我們上節(jié)說的,對于擴(kuò)展的日志系統(tǒng)都要實(shí)現(xiàn)倆個(gè)接口ILogger、ILoggerPRovider。所以在當(dāng)前工程中也沒例外,NLogLoggerProvider實(shí)現(xiàn)了ILoggerProvider、內(nèi)部類Logger實(shí)現(xiàn)了ILogger。源代碼如下:

public class NLogLoggerProvider : ILoggerProvider    {        private readonly LogFactory _logFactory;        public NLogLoggerProvider(LogFactory logFactory)        {            _logFactory = logFactory;        }        public ILogger CreateLogger(string name)        {            return new Logger(_logFactory.GetLogger(name));        }        private class Logger : ILogger        {            private readonly global::NLog.Logger _logger;            public Logger(global::NLog.Logger logger)            {                _logger = logger;            }            public void Log(                LogLevel logLevel,                int eventId,                object state,                Exception exception,                Func<object, Exception, string> formatter)            {                var nLogLogLevel = GetLogLevel(logLevel);                var message = string.Empty;                if (formatter != null)                {                    message = formatter(state, exception);                }                else                {                    message = LogFormatter.Formatter(state, exception);                }                if (!string.IsNullOrEmpty(message))                {                    var eventInfo = LogEventInfo.Create(nLogLogLevel, _logger.Name, message, exception);                    eventInfo.Properties["EventId"] = eventId;                    _logger.Log(eventInfo);                }            }            public bool IsEnabled(LogLevel logLevel)            {                return _logger.IsEnabled(GetLogLevel(logLevel));            }            private global::NLog.LogLevel GetLogLevel(LogLevel logLevel)            {                switch (logLevel)                {                    case LogLevel.Verbose: return global::NLog.LogLevel.Debug;                    case LogLevel.Information: return global::NLog.LogLevel.Info;                    case LogLevel.Warning: return global::NLog.LogLevel.Warn;                    case LogLevel.Error: return global::NLog.LogLevel.Error;                    case LogLevel.Critical: return global::NLog.LogLevel.Fatal;                }                return global::NLog.LogLevel.Debug;            }            public IDisposable BeginScopeImpl([NotNull] object state)            {                return NestedDiagnosticsContext.Push(state.ToString());            }        }    }
NLog

這段代碼很容易讀懂,也就不過多解釋了,需要注意的一點(diǎn)是:LogFactory是NLog的工廠。下面我們主要就NLog和大名鼎鼎的Log4net進(jìn)行比較(道聽途說比較多,歡迎指正)

  • 都不建議直接使用,使用門面類包裝(也就是相當(dāng)于本處的Microsoft.Framework.Logging.NLog的內(nèi)部Logger類實(shí)際是Nlog的log的門面)
  • 如果現(xiàn)在系統(tǒng)使用了日志系統(tǒng),建議使用原有的日志系統(tǒng)(應(yīng)用log4net比較多),完全新的項(xiàng)目建議使用Nlog
  • 從初始化配置上看Nlog要比log4net簡單
  • 從功能強(qiáng)大度上,基本可以平分秋色
  • 從開源代碼更新程度上看:Nlog以及在github上開源(https://github.com/nlog)、log4net在Apache上開源(http://logging.apache.org/log4net/download_log4net.cgi)。但是Nlog還有更新,支持的.net版本也比較多;log4net感覺好久沒更新了,核心版本還是.net2.0(此處不是道聽途說,是樓豬自己下載源碼得倒的結(jié)論)
  • 據(jù)說使用同步記錄日志時(shí)log4net比Nlog要快,但是Nlog可以開啟異步記錄,并且速度會反超log4net

下面是樓主參考的一些博文

  • log4net vs. Nlog [closed](驕傲的豹子)
  • NLog 2.0.0.2000 使用實(shí)例(回復(fù)部分為主要參考,主體是介紹Nlog的使用的)
  • NLog文章系列——系列文章目錄以及簡要介紹(Nlog學(xué)習(xí)的參考)

測試代碼:

<?xml version="1.0" encoding="utf-8" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      autoReload="true">  <targets>    <target name="logfile"             xsi:type="File"             fileName="file.txt"             layout="${longdate}|${level:uppercase=true}|${logger}|${event-context:item=EventId}|${message}|${ndc}" />    <target name="console"             xsi:type="ColoredConsole"             layout="[${level:uppercase=true}:${logger}] ${message}"/>  </targets>  <rules>    <logger name="*" minlevel="Info" writeTo="logfile,console" />  </rules></nlog>
        public Program()        {            // a DI based application would get ILoggerFactory injected instead            var factory = new LoggerFactory();            // getting the logger immediately using the class's name is conventional            _logger = factory.CreateLogger(typeof(Program).FullName);            // providers may be added to an ILoggerFactory at any time, existing ILoggers are updated#if !DNXCORE50            factory.AddNLog(new global::NLog.LogFactory());#endif            factory.AddConsole();            factory.AddConsole((category, logLevel) => logLevel >= LogLevel.Critical && category.Equals(typeof(Program).FullName));        }

Microsoft.Framework.Logging.Console

實(shí)際上用控制臺直接寫日志的并不多,所以這個(gè)日志系統(tǒng)可能用途并不廣,不過精煉的代碼還是有很多可圈可點(diǎn)的地方:使用IConsole接口以及LogConsole類。我們一般來說肯定只會實(shí)現(xiàn)ILogger、ILoggerProvider倆個(gè)接口,也就是寫實(shí)現(xiàn)類ConsoleLogger、ConsoleLoggerProvider。但是我們主要到ConsoleLogger只是負(fù)責(zé)記錄的邏輯操作,具體對于介質(zhì)的操作屬于IConsole的職責(zé),如果將ConsoleLogger與LogConsole柔和在一起,問題也不大;但是明顯違反了面向?qū)ο笤O(shè)計(jì)的單一職責(zé)原則。所以麻雀雖小,五臟俱全,這幾個(gè)小類也能體現(xiàn)面向?qū)ο蟮哪芰Φ摹?/p>

Microsoft.Framework.Logging.TraceSource

這個(gè)對于我來說是個(gè)陌生的東西,雖然是.net自帶的,并且從1.0就有了。最開始使用的時(shí)Debug和Trace進(jìn)行跟蹤、記錄,到.net2.0時(shí),使用TraceSource作為Debug和Trace的增強(qiáng)版本。

TraceSource的配置:

  • Listeners:控制跟蹤信息輸出的方向(可以是:TextWriterTraceListener,DefaultTraceListener,EventLogTraceListener,WebPageTraceListener等,而TextWriterTraceListener的子類又有ConsoleTraceListener, DelimitedListTraceListener,XmlWriterTraceListener,EventSchemaTraceListener)
  • Switch:篩選信息的開關(guān),主要包括BooleanSwitch 類、TraceSwitch 類和 SourceSwitch 類

主要參考的文獻(xiàn):

  • Trace、Debug和TraceSource的使用以及日志設(shè)計(jì)
  • TraceSource記錄程序日志
  • TraceSource 類

我們回頭看Microsoft.Framework.Logging.TraceSource代碼,也就一目了然了.

    public class TraceSourceLoggerProvider : ILoggerProvider    {        private readonly SourceSwitch _rootSourceSwitch;        private readonly TraceListener _rootTraceListener;        private readonly ConcurrentDictionary<string, TraceSource> _sources = new ConcurrentDictionary<string, TraceSource>(StringComparer.OrdinalIgnoreCase);        public TraceSourceLoggerProvider([NotNull]SourceSwitch rootSourceSwitch, [NotNull]TraceListener rootTraceListener)        {            _rootSourceSwitch = rootSourceSwitch;            _rootTraceListener = rootTraceListener;        }        public ILogger CreateLogger(string name)        {            return new TraceSourceLogger(GetOrAddTraceSource(name));        }        private TraceSource GetOrAddTraceSource(string name)        {            return _sources.GetOrAdd(name, InitializeTraceSource);        }        private TraceSource InitializeTraceSource(string traceSourceName)        {            var traceSource = new TraceSource(traceSourceName);            string parentSourceName = ParentSourceName(traceSourceName);            if (string.IsNullOrEmpty(parentSourceName))            {                if (HasDefaultSwitch(traceSource))                {                    traceSource.Switch = _rootSourceSwitch;                }                if (_rootTraceListener != null)                {                    traceSource.Listeners.Add(_rootTraceListener);                }            }            else
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 左权县| 鞍山市| 阿勒泰市| 康乐县| 辽宁省| 岐山县| 清原| 甘谷县| 乐业县| 泰州市| 融水| 红桥区| 衡阳县| 西藏| 漯河市| 巴彦淖尔市| 蕲春县| 运城市| 新民市| 萝北县| 青阳县| 浮梁县| 永定县| 水富县| 威远县| 东方市| 广汉市| 荆门市| 林甸县| 青铜峡市| 汉中市| 景德镇市| 新建县| 新兴县| 丹阳市| 南陵县| 建瓯市| 团风县| 准格尔旗| 城口县| 巩义市|