.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系统自身针对各种事件的日志,我们的应用 ...
随机推荐
- asp.net mvc自动压缩文件,并生成CDN引用
很多站点都是用了静态文件分离.我推荐一种处理静态文件分离的方式. BundleExtensions.cs public static class BundleExtensions { public s ...
- ionic2中使用moment.js
安装 npm i moment --save 使用 import { Pipe, PipeTransform } from '@angular/core'; import Moment from 'm ...
- postgresql 查询某一个表中的所有字段
select * from information_schema.columns where table_schema='public' and table_name='表名称 ';
- google hacking
Google是一个强大的搜索引擎:而对于黑客而言,则可能是一款绝佳的黑客工具.正因为google的检索能力强大,黑客可以构造特殊的关键字,使用Google搜索互联网上的相关隐私信息.通过Google, ...
- jmeter访问mysql数据库
jdbc:mysql://localhost:3306/jy?allowMultiQueries=true 如果想同时执行多条语句
- JavaScript onmousewheel鼠标滚轮示例
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- IDEA创建Web项目(maven)
第一步:创建项目 第二步:使用maven创建,并选择jdk 第三步:修改项目名称 第四步:选择自动导入依赖(很重要!!) 第五步:添加核心依赖和打包 第六步:编译一下 第七步:配置web容器(这里是用 ...
- 初识(试)LoadRunner
一.安装和破解 1.傻瓜式安装.[注意:最好不要默认路径安装,因为64位的win7系统安装LR11时,会默认安装到“Program files (x86)”的目录中,该目录名称有空格,会导致录制“We ...
- thinkphp5 行为(钩子)扩展
行为整理链接 浅谈PHP中的钩子 钩子相当于一个插件,在某些执行顺序上插入进去. 行为可以在写app接口中对所有请求执行到控制器前 执行用户权限判断,sign验证等,这样就不用在每个接口中判断了 注意 ...
- windows下编译php7图形库php_ui.dll
CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...