亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[Asp.net 5] Logging-其他日志系統的實現

2019-11-17 02:09:01
字體:
來源:轉載
供稿:網友

[asp.net 5] Logging-其他日志系統的實現

Microsoft.Framework.Logging.NLog

使用Nlog擴展日志系統:按照我們上節說的,對于擴展的日志系統都要實現倆個接口ILogger、ILoggerPRovider。所以在當前工程中也沒例外,NLogLoggerProvider實現了ILoggerProvider、內部類Logger實現了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

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

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

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

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

測試代碼:

<?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

實際上用控制臺直接寫日志的并不多,所以這個日志系統可能用途并不廣,不過精煉的代碼還是有很多可圈可點的地方:使用IConsole接口以及LogConsole類。我們一般來說肯定只會實現ILogger、ILoggerProvider倆個接口,也就是寫實現類ConsoleLogger、ConsoleLoggerProvider。但是我們主要到ConsoleLogger只是負責記錄的邏輯操作,具體對于介質的操作屬于IConsole的職責,如果將ConsoleLogger與LogConsole柔和在一起,問題也不大;但是明顯違反了面向對象設計的單一職責原則。所以麻雀雖小,五臟俱全,這幾個小類也能體現面向對象的能力的。

Microsoft.Framework.Logging.TraceSource

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

TraceSource的配置:

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

主要參考的文獻:

  • Trace、Debug和TraceSource的使用以及日志設計
  • 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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久国产精品免费网站| 亚洲一级片在线看| 97在线视频一区| 北条麻妃一区二区三区中文字幕| 亚洲精品一区二三区不卡| 国产精品丝袜久久久久久不卡| 亚洲午夜未删减在线观看| 国产日韩中文在线| 日韩成人激情在线| 中文字幕久久久| 97国产在线观看| 久久青草福利网站| 亚洲国产欧美久久| 91精品国产高清| 国产一区二区动漫| 日韩视频亚洲视频| 国产精品永久免费视频| www.国产精品一二区| 国产精品香蕉av| 久久国产精品免费视频| 992tv在线成人免费观看| 日本亚洲欧美成人| 亚洲精品久久久久中文字幕欢迎你| 91久久精品国产91久久性色| 久久91亚洲精品中文字幕| 亚洲女人天堂网| 欧美视频一二三| 国产极品精品在线观看| 欧美电影院免费观看| 中文.日本.精品| 亚洲已满18点击进入在线看片| 欧美激情综合色| 一区二区三区天堂av| 欧美大码xxxx| 78m国产成人精品视频| 久久精品国产亚洲7777| 国模精品视频一区二区三区| 精品一区二区三区电影| 国产精品香蕉在线观看| 中文字幕亚洲一区二区三区| 亚洲人成电影在线| 欧美精品激情在线观看| 亚洲最大成人免费视频| 中文字幕亚洲欧美日韩2019| 亚洲国产精品一区二区三区| 欧美成人合集magnet| 在线日韩日本国产亚洲| 欧美乱大交xxxxx另类电影| 国产成人av在线播放| 欧美日韩黄色大片| 国产一区二区黄| 国产精品69av| 精品国产乱码久久久久久虫虫漫画| 日韩不卡中文字幕| 热久久美女精品天天吊色| 亚洲理论电影网| 国产成人精品优优av| 亚洲aⅴ男人的天堂在线观看| 亚洲精品免费一区二区三区| 久久久国产精品亚洲一区| 最近2019中文字幕一页二页| 国产精品久久久久久影视| 在线观看视频亚洲| 青青青国产精品一区二区| 欧美性猛交xxxx免费看| 欧美激情第6页| 丝袜一区二区三区| 亚洲欧洲第一视频| 欧美精品生活片| 一区三区二区视频| 成人夜晚看av| 欧美激情久久久久| 精品自在线视频| 国产精品一区二区3区| 久久手机免费视频| 成人免费网站在线| 中文字幕日韩精品在线| 国产黑人绿帽在线第一区| 国产99久久久欧美黑人| 啪一啪鲁一鲁2019在线视频| 国产免费一区视频观看免费| 国产99久久精品一区二区| 日本一区二三区好的精华液| 欧美视频13p| 欧美性猛交丰臀xxxxx网站| 欧美性高潮床叫视频| 综合欧美国产视频二区| 欧美精品激情blacked18| 精品久久久精品| 这里只有精品久久| 国产欧美精品日韩精品| 久久久久久久电影一区| 琪琪第一精品导航| 国产精品永久免费观看| 亚洲韩国欧洲国产日产av| 久久久久久91香蕉国产| 日韩美女视频在线观看| 国外成人性视频| 2023亚洲男人天堂| 国产精品美女av| 国产成人综合av| 色老头一区二区三区| 亚洲无线码在线一区观看| 欧美日韩亚洲一区二| 欧美黄色三级网站| 波霸ol色综合久久| 亚洲女人天堂成人av在线| 国产精品91在线| 欧美理论在线观看| 97视频免费在线观看| 久久久久女教师免费一区| 国产日本欧美一区| 亚洲最大成人在线| 欧美性一区二区三区| 欧美激情一区二区三区在线视频观看| 国产主播欧美精品| 亚洲无限乱码一二三四麻| 欧美丰满少妇xxxxx| 国产拍精品一二三| 欧美激情精品久久久久久免费印度| 国产成人精品日本亚洲| 欧美性20hd另类| 91精品国产91久久久久久久久| 欧美专区在线观看| 中文字幕成人精品久久不卡| 欧美大片免费观看在线观看网站推荐| 亚洲成人av中文字幕| 亚洲国产精品系列| 国产精品美女在线观看| 欧美肥老太性生活视频| 日韩精品免费在线| 911国产网站尤物在线观看| 亚洲开心激情网| 欧美日韩免费网站| 久久夜色精品亚洲噜噜国产mv| 日韩最新在线视频| 亚洲春色另类小说| 97人人爽人人喊人人模波多| 欧美国产日韩xxxxx| 国产日韩在线观看av| 久久久免费观看| 久久九九全国免费精品观看| 欧美老女人www| 色视频www在线播放国产成人| 欧美日韩国产二区| 日韩中文字幕在线视频| 97国产成人精品视频| 日韩影视在线观看| 欧美精品九九久久| 亚洲最大激情中文字幕| 九九热99久久久国产盗摄| 亚洲成色777777在线观看影院| 成人黄色大片在线免费观看| 欧美成人免费全部观看天天性色| 欧美精品精品精品精品免费| 九九热精品视频| 亚洲精品之草原avav久久| 国内精品模特av私拍在线观看| 欧美日韩激情小视频| 成人免费视频97| 精品亚洲一区二区| 国产偷国产偷亚洲清高网站| 岛国视频午夜一区免费在线观看| 欧美自拍视频在线观看|