解读ASP.NET 5 & MVC6系列(9):日志框架
原文:解读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); //CreateLoggervar logger2 = factory.CreateLogger<HomeController>();  //CreateLoggerlogger1.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);
}

实现了上述两个接口,即可通过factoryAddProvider方法,将该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系列

posted on 2015-05-27 10:49 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4532785.html

解读ASP.NET 5 MVC6系列(9):日志框架相关推荐

  1. 解读ASP.NET 5 MVC6系列(6):Middleware详解

    在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...

  2. [转]解读ASP.NET 5 MVC6系列(7):依赖注入

    本文转自:http://www.cnblogs.com/TomXu/p/4496440.html 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Inject ...

  3. 解读ASP.NET 5 MVC6系列(7):依赖注入

    原文:解读ASP.NET 5 & MVC6系列(7):依赖注入 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET ...

  4. 解读ASP.NET 5 MVC6系列(17):MVC中的其他新特性

    原文:解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性 (GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_Global ...

  5. 解读ASP.NET 5 MVC6系列(10):Controller与Action

    原文:解读ASP.NET 5 & MVC6系列(10):Controller与Action 我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Contro ...

  6. 解读ASP.NET 5 MVC6系列(14):View Component

    原文:解读ASP.NET 5 & MVC6系列(14):View Component 在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为M ...

  7. 解读ASP.NET 5 MVC6系列(13):TagHelper

    解读ASP.NET 5 & MVC6系列(13):TagHelper 原文:解读ASP.NET 5 & MVC6系列(13):TagHelper 在新版的MVC6中,微软提供了强大的T ...

  8. 汤姆大叔 MVC6 系列教程网摘

    解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 & MVC6系列(2):初识项目 解读ASP.NET 5 & MVC6系列(3) ...

  9. ASP.NET企业开发框架IsLine FrameWork系列之八--AppLogProvider日志框架(下)

    ASP.NET企业开发框架IsLine FrameWork系列之八--AppLogProvider日志框架(下) 接上文 上面的配置实例是按照将日志写入文本文件来配置的(节点具体含义见上文),程序调用 ...

最新文章

  1. Python修改Mitsuba的XML相关参数
  2. PHP基础1--环境搭建
  3. XX System Test Plan
  4. python3语音识别模块_零基础教你玩转语音控制,学习语音控制技术,打造智能生活很简单...
  5. 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
  6. 【转】vc6.0配置STLPort
  7. 异步社区本周新上电子书
  8. 户外移动电源:华宝新能、EcoFlow上演“龙虎斗”
  9. 有哪些PDF分割工具?建议收藏这些工具
  10. Android常用高质量框架
  11. SaaSBase:什么是为知笔记?
  12. MySQL 数据库删除操作中的 delete、drop、 truncate 区别在哪?
  13. Qt学习总结之QTableWidget表格填充
  14. FPGA之IP核的使用、搞懂功能仿真和时序仿真
  15. SQL Server密码破解工具
  16. nz-select 选择器
  17. LabVIEW控制Arduino实现示波器(基础篇—7)
  18. linux操作系统:x86架构,一个良好的运营环境
  19. 饥荒mod制作教程--物品(食物)该篇主讲贴图--01
  20. python中的转义符\

热门文章

  1. 分类算法——K近邻算法及其R实现
  2. 银监会周末突发4号文件,18年贷款比想象的要难
  3. 有法院被执行人记录还能贷款吗?
  4. 与鬼古女夜晚后海边的“恐怖”聚会
  5. 红外传感器型号和参数_红外传感器参数|热释电红外传感器参数
  6. python怎么退出help_(转)python中如何使用help命令?
  7. python实现rm_python winrm模块使用
  8. 同一个网络中为什么有些计算机可以连接共享打印机,有些需要输入密码,安装局域网共享打印机时,要求输入用户和密码,但对方并没有设置,为什么?谢谢!!...
  9. 【TensorFlow-windows】keras接口——ImageDataGenerator裁剪
  10. Requests库的主要方法:requests.request为requests.get和requests.post两个的汇总,只是需要传方法...