.Net core的日志系统
.net core是内置了日志系统的,本文这里简单的介绍一下它的基本用法。如下是一个简单的示例:
var service = new ServiceCollection()
.AddLogging(logging => { logging.AddConsole(); }); var provider = service.BuildServiceProvider();
var logFactory = provider.GetService<ILoggerFactory>();
var logger = logFactory.CreateLogger("MyLogger"); logger.LogInformation("hello world. {0}", DateTime.Now);
主要步骤如下:
- 在DI服务中通过AddLogging的配置日志服务
- 通过DI服务获取ILoggerFactory
- 通过日志工厂创建ILogger
- 通过ILogger写日志
需要注意的是,日志是异步输出的,如果调用logger.LogInformation后程序马上结束,是不会有日志输出的。
ILogger和ILogger<T>
ILogger是我们实际用-来记录日志的对象,前面的例子已经演示了它的使用方法,在.net core日志系统中,还提供了另一个接口ILogger<T>,它的创建方式如下:
var logger = logFactory.CreateLogger<Program>();
ILogger<T>本身也是继承自ILogger的,也就是说,他们的用法基本一样,ILogger<T>的主要区别是创建的时候无需制定数据源名称,它的数据源就是类名,也就是说,它和如下方式创建的ILogger功能基本上是一致的。
var logger = logFactory.CreateLogger(typeof(Program).FullName);
那么为什么要创建一个ILogger<T>呢?我个人认为应为因为获取它是不需要制定参数,更容易和DI框架集成,我们可以通过如下代码获取ILogger<T>,而不需要先获取ILoggerFactory
var logger = provider.GetService<ILogger<Program>>();
日志结构
.net core的日志系统支持不同的日志框架,并且对外统一了日志的格式,不管使用哪种库,它的格式是一样的。这样的好处是切换日志框架时,上层应用无需修改。一个基本的日志样例为:
info: MyLogger[]
hello world. 03/23/2019 22:37:58
它主要包括如下几个部分:
- 日志级别: 日志级别定义在LogLevel枚举中,它包含如下几个级别:Trace、Debug、Information、Warning、Error、Critical。另外还有一个特殊级别None,它的值比Critical还高,主要用于关闭日志输出, 当配置最小输出级别时None时,由于它的级别比Critical还高,则所有的日志都不会输出。
- 日志源: 用于标志日志的数据源,它是一个字符串,保存在具体的ILog对象中,本例中就是"MyLogger"
- 事件Id: 它标志了日志的序列号,大部分的时候都不会用到它
- 日志体:
日志内容
日志提供程序
ASP.NET Core 内置了如下几种日志提供程序:
前面的示例中,如果要增加其他的日志提供程序,可以在DI框架初始化的时候进行。
var service = new ServiceCollection()
.AddLogging(logging => { logging.AddConsole(); }); var provider = service.BuildServiceProvider();
var logFactory = provider.GetService<ILoggerFactory>();
var logger = logFactory.CreateLogger("MyLogger"); logger.LogInformation("hello world. {0}", DateTime.Now);
虽然系统内置了这些日志框架比较方便,但实际上用起来是不够用的,比如说它不能输出到文件,不过好在.net core提供了比较强大的扩展机制,我们可以参考这篇文章使用第三方的日志提供程序输出到文件:Creating a rolling file logging provider for ASP.NET Core 2.0。
采用同样的方式,我们也可以使用NLog、Seriallog等更为专业的日志框架,甚至他们已经做好了适配,直接拿来用都可以。
Log配置文件
一个典型的日志系统的配置文件如下:
{
"Logging": {
"LogLevel": { // 表示全局
"Default": "Warning" // 不指定CategoryName,应用于所有Category
},
"Console": { // 指定 ProviderName,仅针对于 ConsoleProvider
"Default": "Warning",
"Microsoft": "Error" // 指定CategoryName为Microsoft的日志级别为Error
}
}
}
我们可以通过AddConfiguration函数指定日志配置文件:
var configBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
var config = configBuilder.Build();
var service = new ServiceCollection()
.AddLogging(logging =>
{
logging.AddConfiguration(config.GetSection("Logging"));
logging.AddConsole();
});
参考文章:
.Net core的日志系统的更多相关文章
- ASP.NET Core分布式日志系统ELK实战演练
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. • Elastics ...
- 重新整理 .net core 实践篇—————日志系统之结构化[十八]
前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...
- Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统
Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据.它使用 Java 编写,基于 Apac ...
- 重新整理 .net core 实践篇—————日志系统之战地记者[十五]
前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...
- 重新整理 .net core 实践篇—————日志系统之作用域[十七]
前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...
- 重新整理 .net core 实践篇—————日志系统之服务与日志之间[十六]
前言 前文介绍了一些基本思路,那么这里介绍一下,服务如何与配置文件配合. 正文 服务: public interface ISelfService { void ShowLog(); } public ...
- .NET 黑魔法 - asp.net core 日志系统
asp.net core 里如何记录日志呢? 这要从asp.net core的依赖注入说起,在asp.net core里的依赖注入真是无所不在,各种面向切面的接口与事件. 好吧,来点干货. 首先,我们 ...
- .NET Core的日志[5]:利用TraceSource写日志
从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...
- .NET Core的日志[4]:将日志写入EventLog
面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针对各种事件的日志,我们的应用 ...
随机推荐
- alpha冲刺3/10
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺3 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 组织第一次团队编程 继续阅读小程序开发文档 接下来的 ...
- python之PIL 二值图像处理和保存
0. 1.参考 http://pszpcl.baike.com/article-77327.htmlwindows 图片右键:属性 详细信息 位深度位深度 用于指定图像中的每个像素可以使用的颜色信息数 ...
- NEST - 编写查询
Writing queries Version:5.x 英文原文地址:Writing queries 将数据索引到了 Elasticsearch 之后,就可以准备搜索它们了.Elasticsearch ...
- 有关centos7 图形化root用户登录
好久不用的虚拟机开机后,是图形化登录界面,原来是命令行界面,后来安装和图形化 结果使用我记录的root密码死活登录不了,心想是不是时间久了忘记了root密码 然后开始尝试各种单用户修改root密码,再 ...
- Get与Post区别小结
Get:是以实体的方式得到由请求Url所指定资源的信息,如果请求Url只是一个数据产生过程,那么最终要在实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述. Post:是用来向 ...
- root用户无法通过ssh连接Linux系统
ssh协议为了安全,有些版本默认禁止root用户的登陆 cd /etc/ssh 编辑sshd_config文件 cat sshd_config | grep PermitRootLogin Permi ...
- Snowflake Snow Snowflakes POJ - 3349(hash)
You may have heard that no two snowflakes are alike. Your task is to write a program to determine wh ...
- UVA 796 Critical Links(模板题)(无向图求桥)
<题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...
- Diango之通过form表单向服务端发送数据
通过form表单向服务端发送数据 表单元素 表单:form></form>表单用于向服务器传输数据.另外一种向服务端传输数据的方式为ajax. form属性: action:提交表单 ...
- React + antd 组件离开页面以后出现Can only update a mounted or mounting component 的解决办法
做项目的过程中,来回切换页面时,一直遇到Can only update a mounted or mounting component 这个问题,原因是当离开页面以后,组件已经被卸载,执行setSta ...