解读ASP.NET 5 & MVC6系列(9):日志框架
框架介绍
在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net、NLog、CommonLogging使用起来多多少少都有些费劲,和java的SLF4J根本无法相比。但在新版的ASP.NET5中,可谓是牛气冲天,微软提供的Microsoft.Framework.Logging框架集可谓就是.NET版的SLF4J,提供相应的接口,其它第三方组件可以根据接口实现自己的实现。
ILoggerFactory接口
ILoggerFactory
接口是日志的入库点,在系统中通过依赖注入可以获取该接口的实例,并根据该示例创建日志记录器ILogger
来记录日志,示例如下:
var factory = ServiceProvider.GetRequiredService<ILoggerFactory>();
var logger1 = factory.CreateLogger(typeof(HomeController).FullName); //CreateLogger
var logger2 = factory.CreateLogger<HomeController>(); //CreateLogger
logger1.Log(LogLevel.Information, 1, null, null, null); // 日志记录
logger1.LogInformation("123"); // 扩展方法
logger1.LogError("123"); // 扩展方法
或者,你也可以在Startup.cs的Configure方法中,从loggerfactory参数中获取上述示例。
ILoggerFactory
接口的定义如下:
public interface ILoggerFactory
{
//日志最小记录级别
LogLevel MinimumLevel { get; set; }
//创建日志记录实例
ILogger CreateLogger(string categoryName); //一般是根据功能模块或类名进行分类
void AddProvider(ILoggerProvider provider); // 添加日志记录provider(如第三方实现)
}
在该接口的实现中,我们可以设置日志的最小记录基本,其类别如下:
public enum LogLevel
{
Debug = 1,
Verbose = 2,
Information = 3,
Warning = 4,
Error = 5,
Critical = 6,
}
也可以添加第三方实现的Provider,比如添加一个控制台版本的实现:
public static ILoggerFactory AddConsole(this ILoggerFactory factory)
{
factory.AddProvider(new ConsoleLoggerProvider((category, logLevel) => logLevel >= LogLevel.Information));
return factory;
}
然后通过CreateLogger方法创建日志记录器实例,最后再记录日志。
ILoggerProvider和ILogger
所有的第三方实现都需要实现ILoggerProvider接口和ILogger接口,其中接口很简单,就是实现创建ILogger接口的方法即可,代码如下:
public interface ILoggerProvider
{
ILogger CreateLogger(string name); //创建给定类别的ILgger实例
}
而ILogger的实现,也相对简单,除了实现通用的日志记录方法以外,还需要实现一个日志级别判断的方法以及一个作用域创建方法,接口定义如下:
public interface ILogger
{
//支持大多数日志记录的通用方法,其它访问通过扩展方法进行完善
void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter);
//判断是否可以记录给定的日志级别
bool IsEnabled(LogLevel logLevel);
//开启一个逻辑操作作用域
IDisposable BeginScopeImpl(object state);
}
实现了上述两个接口,即可通过factory
的AddProvider
方法,将该provider添加到实例中,达到记录日志的目的。ASP.NET 5中目前的默认实现了4中日志记录Provider,分别是:Console、NLog、Serilog、Trace,注册这些Provider的时候,均可以使用扩展方法,实例如下:
loggerfactory.AddConsole()
loggerfactory.AddNLog(new NLog.LogFactory())
loggerfactory.AddSerilog(new LoggerConfiguration())
var testSwitch = new SourceSwitch("TestSwitch", "Level will be set to warning for this test");
factory.AddTraceSource(testSwitch, new ConsoleTraceListener());
ILogger的扩展方法
为了方便记录日志,微软在Microsoft.Framework.Logging.LoggerExtensions
上,针对6个级别的日志记录均定义了6个如下形式的扩展方法,实例如下:
public static void LogInformation(this ILogger logger, string message)
public static void LogInformation(this ILogger logger, int eventId, string message)
public static void LogInformation(this ILogger logger, string format, params object[] args)
public static void LogInformation(this ILogger logger, int eventId, string format, params object[] args)
public static void LogInformation(this ILogger logger, ILogValues state, Exception error = null)
public static void LogInformation(this ILogger logger, int eventId, ILogValues state, Exception error = null)
// 其它Debug、Verbose、Warning、Error、Critical也都遵循LogXXXX()规则.
所以使用的时候,我们可以使用像LogDebug()、LogError()这样的方法来进行快速记录日志。另外,该类还为Warning、Error、Critical三个级别,又分别定义了2个扩展方法,示例如下:
public static void LogWarning(this ILogger logger, string message, Exception error)
public static void LogWarning(this ILogger logger, int eventId, string message, Exception error)
有些这些扩展方法,使用起来估计打遍天下无敌手了。
总结
通过基于接口的编程机制和DI依赖注入机制,我们可以很容易实现第三方日志provider的扩展,从而将日志记录到我们想记录的任意地方,如MongoDB等NoSQL数据库。
同步与推荐
本文已同步至目录索引:解读ASP.NET 5 & MVC6系列
解读ASP.NET 5 & MVC6系列(9):日志框架的更多相关文章
- 解读ASP.NET 5 & MVC6系列
本系列的大部分内容来自于微软源码的阅读和网络,大部分测试代码都是基于VS RC版本进行测试的. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 ...
- 解读ASP.NET 5 & MVC6系列(6):Middleware详解
在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...
- 解读ASP.NET 5 & MVC6 ---- 系列文章
本系列的大部分内容来自于微软源码的阅读和网络,大部分测试代码都是基于VS RC版本进行测试的. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 ...
- 解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性
(GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtml平级,该文件的功能类 ...
- 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑
之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写,所有的视图引擎都继承于该IVi ...
- 解读ASP.NET 5 & MVC6系列(15):MvcOptions配置
程序模型处理 IApplicationModelConvention 在MvcOptions的实例对象上,有一个ApplicationModelConventions属性(类型是:List<IA ...
- 解读ASP.NET 5 & MVC6系列(14):View Component
在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能.但在MVC6中,这一功能得到了 ...
- 解读ASP.NET 5 & MVC6系列(13):TagHelper
在新版的MVC6中,微软提供了强大的TagHelper功能,以便让我们摆脱如下的臃肿代码: @Html.LabelFor(model => model.FullName) @Html.EditF ...
- 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现
前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...
随机推荐
- jQuery对象和DOM对象的区别
jQuery对象和DOM对象使用说明,需要的朋友可以参考下.1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象,哪些是 DOM对象,因此需要重点了解jQuery ...
- Conversations is being developed
Development Conversations is being developed on GitHub by a team of volunteers under the lead of pro ...
- 关于 ASP.NET MVC 中的视图生成
在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通 ...
- 回车去替换铵钮的click点击功能
某一时候,我们不想在form的所有必填的域均完成之后,再去使用mouse去点击铵钮来提交数据.而是直接按回车去focus提交的铵钮来提交. 可以写jQuery script程序:
- DataGridView绑定源码下载
效果图: 源码下载:http://hovertree.com/h/bjaf/bbot18bj.htm 上面源码不包含数据库的查询,需要获取数据库数据的话,请看这个的源码: http://hovertr ...
- C# 之 EXCEL导入导出
以下方式是本人总结的一些经验,肯定有很多种方法,在此先记下,留待以后补充... 希望朋友们一起来探讨相关想法,请在下方留言. A-1:EXCEL模板导出 非常简单,将EXCEL模板上传到项目中后,将其 ...
- ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后
序言 随着MVC6RC2的推出,MVC6的脚步越来越近了.但是在我们的手里,有大批量的MVC5的项目.如何将MVC5升级到MVC6,将是一个很大的课题.微软官方暂时没有一个升级指导,或者一个迁移工具, ...
- EF里单个实体的增查改删以及主从表关联数据的各种增删 改查
本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...
- python之最强王者(8)——字典(dictionary)
1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...
- Spring+SpringMVC+Hibernate简单整合(转)
SpringMVC又一个漂亮的web框架,他与Struts2并驾齐驱,Struts出世早而占据了一定优势,下面同样做一个简单的应用实例,介绍SpringMVC的基本用法,接下来的博客也将梳理一下Str ...