ASP.NET基础教程 控件编程.NET设计模式 高级应用
返回首页
当前位置: 首页 > ASP.NET教程 > .NET设计模式 >

在Asp.net MVC6 RC里使用NLog,并且把配置集成到config.json

时间:2015-06-17 10:12来源:未知 作者:admin 点击:我要投稿  高质量的ASP.NET空间,完美支持1.0/2.0/3.5/4.0/MVC等

 实际上aspnet的开发人员已经在最近版的系统里开始集成nlog了。 本文的目的主要帮助大家理解aspnet mvc 6的框架。

新建工程 "NlogTest"

选“asp.net 5”的”web site”,  然后不要认证模块,我们主要演示NLog的用法,对auth认证没兴趣。

 

◎添加Nlog参照

打开project.json, 添加 NLog,同时删除dnxcore50,Nlog还没有支持coreclr,所以先删了。

修改frameworks部分,修改后的样子。

 

  1. "frameworks": { 
  2.     "dnx451": { 
  3.       "dependencies": { "NLog""3.2.0" } 
  4.     } 
  5.   }, 

添加nlog的配置到config.json里,5行以下为本次追加内容。

 

  1.   "AppSettings": { 
  2.     "SiteTitle""NLogTest" 
  3.   }, 
  4.   "nlog": { 
  5.     "targets": { 
  6.       "file": { 
  7.         "type""File"
  8.         "layout""${date:format=HH\\:MM\\:ss} ${logger} ${message}"
  9.         "fileName""c:\\work\\aaa.txt" 
  10.       }, 
  11.       "file2": { 
  12.         "type""File"
  13.         "fileName""c:\\work\\bbb.txt" 
  14.       } 
  15.       "mail1": { 
  16.  
  17.       } 
  18.     }, 
  19.     "rules": { 
  20.       "rule1": { 
  21.         "minlevel""Debug"
  22.         "writeTo""file" 
  23.       }, 
  24.       "rule2": { 
  25.         "name""*"
  26.         "minlevel""Info"
  27.         "writeTo""file2" 
  28.       } 
  29.     } 
  30.   } 

配置到此为止,下面开始编程。

添加一个NLogProvider类, 实现ILoggerProvider并在其内部实现ILogger

先上代码,我是微软的实现中搬过来的,做了一些修改。

 

  1. using Microsoft.Framework.Logging; 
  2. using System; 
  3.  
  4. namespace NLogTest 
  5.     public class NLogProvider:ILoggerProvider 
  6.     { 
  7.         private readonly global::NLog.LogFactory _logFactory; 
  8.  
  9.         public NLogProvider(global::NLog.LogFactory logFactory) 
  10.         { 
  11.             _logFactory = logFactory; 
  12.         } 
  13.  
  14.         public ILogger CreateLogger(string name) 
  15.         { 
  16.             return new Logger(_logFactory.GetLogger(name)); 
  17.         } 
  18.  
  19.         private class Logger : ILogger 
  20.         { 
  21.             private readonly global::NLog.Logger _logger; 
  22.  
  23.             public Logger(global::NLog.Logger logger) 
  24.             { 
  25.                 _logger = logger; 
  26.             } 
  27.  
  28.             public IDisposable BeginScope(object state) 
  29.             { 
  30.                 return global::NLog.NestedDiagnosticsContext.Push(state.ToString()); 
  31.             } 
  32.  
  33.             public bool IsEnabled(LogLevel logLevel) 
  34.             { 
  35.                 return _logger.IsEnabled(GetLogLevel(logLevel)); 
  36.             } 
  37.  
  38.             public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter) 
  39.             { 
  40.                 var nLogLogLevel = GetLogLevel(logLevel); 
  41.                 var message = string.Empty; 
  42.                 if (formatter != null
  43.                 { 
  44.                     message = formatter(state, exception); 
  45.                 } 
  46.                 else 
  47.                 { 
  48.                     message = LogFormatter.Formatter(state, exception); 
  49.                 } 
  50.  
  51.                 if (!string.IsNullOrEmpty(message)) 
  52.                 { 
  53.                     var eventInfo = global::NLog.LogEventInfo.Create(nLogLogLevel, _logger.Name, message); 
  54.                     eventInfo.Properties["EventId"] = eventId; 
  55.                     _logger.Log(eventInfo); 
  56.                 } 
  57.             } 
  58.  
  59.             private global::NLog.LogLevel GetLogLevel(LogLevel logLevel) 
  60.             { 
  61.                 switch (logLevel) 
  62.                 { 
  63.                     case LogLevel.Verbose: return global::NLog.LogLevel.Debug; 
  64.                     case LogLevel.Information: return global::NLog.LogLevel.Info; 
  65.                     case LogLevel.Warning: return global::NLog.LogLevel.Warn; 
  66.                     case LogLevel.Error: return global::NLog.LogLevel.Error; 
  67.                     case LogLevel.Critical: return global::NLog.LogLevel.Fatal; 
  68.                 } 
  69.                 return global::NLog.LogLevel.Debug; 
  70.             } 
  71.         } 
  72.     } 

代码很简单,就是在微软的日志框架和NLog的函数间实现一个桥接。

添加一个NLogLoggerFactoryExtensions类,追加ILoggerFactory的扩张函数,这里是本次演示的重点了。

 

  1. using Microsoft.Framework.ConfigurationModel; 
  2. using Microsoft.Framework.Logging; 
  3. using System; 
  4. using System.Linq; 
  5. using System.Text; 
  6.  
  7. namespace NLogTest 
  8.     public static  class NLogLoggerFactoryExtensions 
  9.     { 
  10.         public static ILoggerFactory AddNLog( 
  11.                 this ILoggerFactory factory, 
  12.                 IConfiguration configuration) 
  13.         { 
  14.             var config = new global::NLog.Config.LoggingConfiguration(); 
  15.  
  16.             var targets = configuration.GetSubKey("targets"); 
  17.  
  18.             foreach (var item in targets.GetSubKeys()) 
  19.             { 
  20.                 AddTargets(config, item.Key, item.Value); 
  21.             } 
  22.  
  23.             var rules = configuration.GetSubKey("rules"); 
  24.             foreach (var item in rules.GetSubKeys()) 
  25.             { 
  26.                 AddLoggingRule(config, item.Value); 
  27.             } 
  28.  
  29.             factory.AddProvider(new NLogProvider(new global::NLog.LogFactory(config))); 
  30.             return factory; 
  31.         } 
  32.  
  33.         private static void AddTargets(global::NLog.Config.LoggingConfiguration configuration, string targetName, IConfiguration targetConf) 
  34.         { 
  35.             string targetType = ""
  36.             if (targetConf.TryGet("type"out targetType)) 
  37.             { 
  38.                 switch (targetType.ToLower()) 
  39.                 { 
  40.                     case "file"
  41.                         configuration.AddTarget(targetName, GenFileTarget(targetName, targetConf)); 
  42.                         break
  43.                     case "mail"
  44.                         configuration.AddTarget(targetName, GenMailTarget(targetName, targetConf)); 
  45.                         break
  46.                     default
  47.                         break
  48.                 } 
  49.             } 
  50.         } 
  51.  
  52.         private static global::NLog.Targets.Target GenFileTarget(string targetName, IConfiguration targetConf) 
  53.         { 
  54.             var fileTarget = new global::NLog.Targets.FileTarget(); 
  55.             fileTarget.Name = targetName; 
  56.  
  57.             string confVal = GetVal(targetConf, "fileName"); 
  58.             if (string.IsNullOrEmpty(confVal)) 
  59.             { 
  60.                 //Filename is not setting , throw exception! 
  61.                 throw new ArgumentNullException("fileTarget's filename is empty."); 
  62.             } 
  63.  
  64.             fileTarget.FileName = confVal; 
  65.  
  66.             confVal = GetVal(targetConf, "layout"); 
  67.             if (!string.IsNullOrEmpty(confVal)) 
  68.             { 
  69.                 fileTarget.Layout = confVal; 
  70.             } 
  71.  
  72.             confVal = GetVal(targetConf, "keepfileopen"); 
  73.             if (!string.IsNullOrEmpty(confVal)) 
  74.             { 
  75.                 fileTarget.KeepFileOpen = (confVal.ToLower() == "true"); 
  76.             } 
  77.  
  78.             confVal = GetVal(targetConf, "encoding"); 
  79.             if (!string.IsNullOrEmpty(confVal)) 
  80.             { 
  81.                 fileTarget.Encoding = Encoding.GetEncoding(confVal); 
  82.             } 
  83.  
  84.             fileTarget.AutoFlush = true
  85.  
  86.             return fileTarget; 
  87.         } 
  88.  
  89.         private static global::NLog.Targets.Target GenMailTarget(string targetName, IConfiguration targetConf) 
  90.         { 
  91.             var mailTarget = new global::NLog.Targets.MailTarget(); 
  92.             mailTarget.Name = targetName; 
  93.  
  94.             string confVal = GetVal(targetConf, "to"); 
  95.             if (string.IsNullOrEmpty(confVal)) 
  96.             { 
  97.                 //to is not setting , throw exception! 
  98.                 throw new ArgumentNullException("mailTarget's [to] is empty."); 
  99.             } 
  100.  
  101.             mailTarget.To = confVal; 
  102.  
  103.             confVal = GetVal(targetConf, "from"); 
  104.             if (string.IsNullOrEmpty(confVal)) 
  105.             { 
  106.                 //to is not setting , throw exception! 
  107.                 throw new ArgumentNullException("mailTarget's [from] is empty."); 
  108.             } 
  109.  
  110.             mailTarget.From = confVal; 
  111.  
  112.             confVal = GetVal(targetConf, "layout"); 
  113.             if (!string.IsNullOrEmpty(confVal)) 
  114.             { 
  115.                 mailTarget.Layout = confVal; 
  116.             } 
  117.  
  118.             confVal = GetVal(targetConf, "subject"); 
  119.             if (!string.IsNullOrEmpty(confVal)) 
  120.             { 
  121.                 mailTarget.Subject = confVal; 
  122.             } 
  123.  
  124.             confVal = GetVal(targetConf, "smtpusername"); 
  125.             if (!string.IsNullOrEmpty(confVal)) 
  126.             { 
  127.                 mailTarget.SmtpUserName = confVal; 
  128.             } 
  129.             confVal = GetVal(targetConf, "smtppassword"); 
  130.             if (!string.IsNullOrEmpty(confVal)) 
  131.             { 
  132.                 mailTarget.SmtpPassword = confVal; 
  133.             } 
  134.  
  135.             confVal = GetVal(targetConf, "smtpserver"); 
  136.             if (!string.IsNullOrEmpty(confVal)) 
  137.             { 
  138.                 mailTarget.SmtpServer = confVal; 
  139.             } 
  140.  
  141.             confVal = GetVal(targetConf, "smtpport"); 
  142.             if (!string.IsNullOrEmpty(confVal)) 
  143.             { 
  144.                 int nPort = 25; 
  145.                 if (int.TryParse(confVal, out nPort)) 
  146.                 { 
  147.                     mailTarget.SmtpPort = nPort; 
  148.                 } 
  149.             } 
  150.  
  151.             return mailTarget; 
  152.         } 
  153.  
  154.         private static void AddLoggingRule(global::NLog.Config.LoggingConfiguration configuration, IConfiguration ruleConf) 
  155.         { 
  156.             string namePattern = "*"
  157.             string confVal = GetVal(ruleConf, " name"); 
  158.             if (!string.IsNullOrEmpty(confVal)) 
  159.             { 
  160.                 namePattern = confVal; 
  161.             } 
  162.  
  163.             confVal = GetVal(ruleConf, "minlevel"); 
  164.             global::NLog.LogLevel minLevel = global::NLog.LogLevel.Debug; 
  165.             if (!string.IsNullOrEmpty(confVal)) 
  166.             { 
  167.                 minLevel = GetLogLevel(confVal, global::NLog.LogLevel.Trace); 
  168.             } 
  169.  
  170.             confVal = GetVal(ruleConf, "writeto"); 
  171.             global::NLog.Targets.Target target = null
  172.             if (!string.IsNullOrEmpty(confVal)) 
  173.             { 
  174.                 target = configuration.ConfiguredNamedTargets.Where(t => t.Name == confVal).FirstOrDefault(); 
  175.             } 
  176.  
  177.             if (target != null
  178.             { 
  179.                 configuration.LoggingRules.Add(new global::NLog.Config.LoggingRule(namePattern, minLevel, target)); 
  180.             } 
  181.         } 
  182.  
  183.         private static string GetVal(IConfiguration configuration, string key) 
  184.         { 
  185.             string val = ""
  186.             if (configuration.TryGet(key, out val)) 
  187.             { 
  188.                 return val; 
  189.             } 
  190.             else 
  191.             { 
  192.                 return null
  193.             } 
  194.         } 
  195.  
  196.         private static global::NLog.LogLevel GetLogLevel(string logLevel, global::NLog.LogLevel defaultLevel = null
  197.         { 
  198.             switch (logLevel.ToLower()) 
  199.             { 
  200.                 case "debug"return global::NLog.LogLevel.Debug; 
  201.                 case "info"return global::NLog.LogLevel.Info; 
  202.                 case "warn"return global::NLog.LogLevel.Warn; 
  203.                 case "error"return global::NLog.LogLevel.Error; 
  204.                 case "fatal"return global::NLog.LogLevel.Fatal; 
  205.             } 
  206.             return defaultLevel; 
  207.         } 
  208.     } 

实例化Nlog.LogFactory类,并从config里读取的配置,设置到该LogFactory里。

下面是NLog的使用了。

 打开 Startup.cs文件,并在Configure函数里AddLog。

 

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) 
  2.         { 
  3.             // Configure the HTTP request pipeline. 
  4.  
  5.             // Add the console logger. 
  6.             loggerfactory.AddConsole(); 
  7.  
  8.             //Add the NLog logger 
  9.             loggerfactory.AddNLog(Configuration.GetSubKey("nlog")); 
  10.  
  11.             //Log Output Test. 
  12.             var logger = loggerfactory.CreateLogger("NLogTest"); 
  13.             logger.LogInformation("this is infomation from startup"); 
  14.  
  15.             try 
  16.             { 
  17.                 var i = 100 - 100; 
  18.                 var j = 100 / i; 
  19.             } 
  20.             catch (DivideByZeroException ex) 
  21.             { 
  22.                 logger.LogError("error log test", ex); 
  23.             } 
  24.  
  25.            。。。。。。。。。。以下略 
  26.             
  27.         } 

在Controller里使用

打开HomeController.cs文件,并追加代码。

 

本站推荐文章:
本站热点文章:
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色 情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片