[Asp.net 5] Logging-日志系统的基本架构(下)
接上节内容,我们继续讲解日志的其他部分.
ILoggerProvider以及扩展类
我们在上节的架构图上并没有看到有直接实现该接口的实现类。那么如果将Logger类直接使用会有什么结果呢?
var factory = new LoggerFactory();
var logger = factory.CreateLogger("name");
logger.Log(LogLevel.Debug, , "state", null, null);
这段代码能够正常运行但是不会记录任何日志。因为Logger类并没有直接记录日志的功能,需要通过LoggerFactory的GetProviders方法创建能够直接工作的ILogger类型日志。所以即使现在的工程中没有对于ILoggerProvider的扩展,但是我们可以预测:Microsoft.Framework.Logging.Console、Microsoft.Framework.Logging.NLog、Microsoft.Framework.Logging.TraceSource都会对ILoggerProvider进行实现,当然由于ILoggerProvider会产生ILogger,所以他们也会实现ILogger类。
ILogValues以及扩展
我们看到日志记录类的接口为:Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
该接口通过formatter将state和exception组合成字符串对象,然后记录到log中。如果使用扩展方法系统传入的formatter永远是:MessageFormatter
private static string MessageFormatter(object state, Exception error)
{
if (state == null && error == null)
{
throw new InvalidOperationException("No message or exception details were found " +
"to create a message for the log.");
} if (state == null)
{
return error.ToString();
} if (error == null)
{
return state.ToString();
} return string.Format(CultureInfo.CurrentCulture, "{0}{1}{2}", state, Environment.NewLine, error);
}
MessageFormatter
如果我们需要记录的信息(state)比较复杂,是一个或多个复杂对象,那么我们一般使用ILogValues对象。
系统中一共为我们提供2个ILogValues接口实现:FormattedLogValues、ReflectionBasedLogValues。
- FormattedLogValues:系统默认扩展传入args以及formatter参数的扩展方法使用,能够将按照formmater的格式,将对象串行成字符串(只支持以及数组)
- ReflectionBasedLogValues:通过反射,获取类的所有属性。(该类会在扩展log中使用)
public class FormattedLogValues : ILogValues
{
private static ConcurrentDictionary<string, LogValuesFormatter> _formatters = new ConcurrentDictionary<string, LogValuesFormatter>();
private readonly LogValuesFormatter _formatter;
private readonly object[] _values; public FormattedLogValues(string format, params object[] values)
{
_formatter = _formatters.GetOrAdd(format, f => new LogValuesFormatter(f));
_values = values;
} public IEnumerable<KeyValuePair<string, object>> GetValues()
{
return _formatter.GetValues(_values);
} public override string ToString()
{
return _formatter.Format(_values);
}
}
FormattedLogValues
public class ReflectionBasedLogValues : ILogValues
{
public virtual IEnumerable<KeyValuePair<string, object>> GetValues()
{
var values = new List<KeyValuePair<string, object>>();
var properties = GetType().GetTypeInfo().DeclaredProperties;
foreach (var propertyInfo in properties)
{
values.Add(new KeyValuePair<string, object>(
propertyInfo.Name,
propertyInfo.GetValue(this)));
}
return values;
}
}
ReflectionBasedLogValues
其他类
- LogLevel:日志的等级
- LogFormatter:与MessageFormatter类似,提供不同的formmater方法。
[Asp.net 5] Logging-日志系统的基本架构(下)的更多相关文章
- Python 中 logging 日志模块在多进程环境下的使用
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...
- Python logging日志系统
写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...
- Asp.net core logging 日志
1 基本概念 Dotnet core 一个重要的特征是 Dependency injection ,中文一般是依赖注入,可以简单理解为一个集合,在应用程序启动时,定义各种具体的实现类型并将其放到集合中 ...
- ASP.NET Core分布式日志系统ELK实战演练
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. • Elastics ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统
Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据.它使用 Java 编写,基于 Apac ...
- [Asp.net 5] Logging-日志系统的基本架构(上)
本节主要介绍解决方案中的Microsoft.Framework.Logging.Abstractions.Microsoft.Framework.Logging俩个工程. 这俩个工程中所有类的关系如下 ...
- [Asp.net 5] Logging-新日志系统目录
楼主有个美好的愿望——把asp.net 5所有能看懂的代码一一呈现给大家(比如C++,楼主就看不懂).现在已经做完了依赖注入.多语言.配置文件三部分,比较基础的日志就成为了楼主的下一个目标.下面是楼主 ...
- Python logging(日志)模块
python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...
随机推荐
- [ASP.NET MVC 小牛之路]15 - Model Binding
Model Binding(模型绑定)是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程.我们之前所有示例中传递给 Action 方法参数的对象都是在 Model Binding ...
- C语言 · 求矩阵各个元素的和
问题描述 这里写问题描述. 输入格式 测试数据的输入一定会满足的格式. 例:输入的第一行包含两个整数n, m,分别表示矩阵的行数和列数.接下来n行,每行m个正整数,表示输入的矩阵. 输出格式 要求用户 ...
- 2013 duilib入门简明教程 -- 自绘控件 (15)
在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...
- SQL语句全
创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...
- Atitit事件代理机制原理 基于css class的事件代理
Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...
- MongoDB 之C#实践
官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads.下载后,还提供了一个酷似msdn的帮助文档. samus驱动:https:/ ...
- 使用easyui-layout布局
<body class="easyui-layout"> <div data-options="region:'north',title:'顶部',sp ...
- C#设计模式系列:观察者模式(Observer)
在软件构建过程中,需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象都需要得到通知. 1.观察者模式简介 1.1>.定义 定义对象间的一种一对多的依赖关系,当一个对 ...
- c数组与字符串
原文链接:http://www.orlion.ga/913/ 一.数组 定义数组: int count[9]; 赋值: int count[4] = { 3, 2, }; 未赋初值的元素用0初始化.如 ...
- ASP.NET WebAPi之断点续传下载(中)
前言 前情回顾:上一篇我们遗留了两个问题,一个是未完全实现断点续传,另外则是在响应时是返回StreamContent还是PushStreamContent呢?这一节我们重点来解决这两个问题,同时就在此 ...