.net 温故知新:【9】.NET日志记录 ILogger使用和原理
日志
日志作为我们程序记录的“黑匣子”是不论什么系统都会使用到的,比如我们经常使用的log4net就是第三方日志记录提供程序。NET 支持使用各种内置和第三方日志记录提供程序的日志记录 API,这篇文章主要介绍的是内置提供程序和API的使用。
日志优先级
如果你使用过log4net的话那么你对这个优先级应该不陌生,在日志记录过程中我们可以对记录的日志信息进行优先级划分,根据优先级我们可以配置只记录哪些优先级别的日志,同时日志信息也会标记这条信息的优先级。在我们查找问题的时候更好的筛选和定位。
.net 的日志优先级LogLevel 分为:Trace = 0、Debug = 1、Information = 2、Warning = 3、Error = 4、Critical = 5 和 None = 6。
日志级别:Trace<Debug<Information<Warning<Error<Critical<None
使用控制台输出日志
现在我们来感受下如何记录输出日志,用控制台程序进行示例。
添加Install-Package Microsoft.Extensions.Logging 日志基础包
Install-Package Microsoft.Extensions.Logging
添加Microsoft.Extensions.Logging.Console 控制台输出日志提供程序包
Install-Package Microsoft.Extensions.Logging.Console
DI注入
ServiceCollection services = new ServiceCollection();
//添加日志到容器
services.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConsole();
}
//回调,或者是叫委托方法,调用AddConsole()添加控制台输入提供程序Provider。
//AddConsole方法就是在Microsoft.Extensions.Logging.Console包中LoggingBuilder的扩展方法。
);
可以通过容器Provider直接获取对象然后调用写日志方法。
当然更常用的是在其它类中使用时通过构造函数注入,使用 DI 中的 ILogger 对象(TCategoryName 类别字符串是任意的,但约定将使用类名称,在日志中能知道是哪个类输出的)。
上面的控制台打印我们注意到没有“调试日志”,“信息日志”的输出,这个是因为未设置默认日志级别,则默认的日志级别值为 Information。所以只输出>=Information的日志。
通过代码设置:
日志设计的原理
如下我大概画了一个逻辑图,对于如何实现日志进行了一个梳理,代码部分未.net源码截取。
通过如上的流程我们知道其实日志对象是由LoggerFactory
类创建的,所以我们不使用注入的方式也可以直接获取日志对象并写日志。
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Debug);
});
ILogger loger = loggerFactory.CreateLogger<Program>();
提供程序
目前内置的日志记录提供程序:
- Console:Console 提供程序将输出记录到控制台。
- Debug:Debug 提供程序使用 System.Diagnostics.Debug 类写入日志输出。
- EventSource:EventSource 提供程序写入名称为 Microsoft-Extensions-Logging 的跨平台事件源。
- EventLog:EventLog 提供程序将日志输出发送到 Windows 事件日志。
比如我们在测试里面添加一个EventLog将日志写入Windows 事件日志:
安装提供程序包:Install-Package Microsoft.Extensions.Logging.EventLog
内置程序未提供对日志记录到文件,所以我们可以使用一些三方包,当然也可以自己开发。
查看地址:三方包
在上一篇 .NET 配置 中我们也见到提供程序这个概念,或者是说这种设计结构,其实.net中很多地方都用到提供程序的思维,然可以灵活扩展。
.net 温故知新:【9】.NET日志记录 ILogger使用和原理的更多相关文章
- ABP理论学习之日志记录
返回总目录 本篇目录 服务端 获取Logger 基类中的Logger 配置 客户端 服务端 ABP使用的是Castle Windsor的日志记录设备.它可以和不同的日志类库一起工作,比如Log4Net ...
- ASP.NET Core 异常处理与日志记录
1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录
缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...
- .NET Core 使用NLog日志记录
前言 每个项目都会需要使用到日志功能,这对于项目上线后 出现的bug异常,能及时定位和便于后期错误分析.那我们今天来看看在.NET Core中如何使用NLog日志. NLog 什么是NLog呢? NL ...
- Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录
[翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.N ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- (14)ASP.NET Core 中的日志记录
1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ...
随机推荐
- 第九十二篇:Vue 自定义指令
好家伙, 1.什么是自定义指令? vue官方提供了v-text,v-for,v-model,v-if等常用的指令.除此之外vue还允许开发者自定义指令. 2.自定义指令的分类 vue中的自定义指令分为 ...
- 第四十八篇:webpack的基本使用(二) --安装和配置webpack-dev-server插件
好家伙, 1.webpack中的默认约定 默认的打包入口文件为src -->index.js 默认的输出文件路径为dist -->main.js 既然有默认,那么就说明肯定能改 2.en ...
- 【短道速滑九】仿halcon中gauss_filter小半径高斯模糊优化的实现
通常,我们谈的高斯模糊,都知道其是可以行列分离的算法,现在也有着各种优化算法实现,而且其速度基本是和参数大小无关的.但是,在我们实际的应用中,我们可能会发现,有至少50%以上的场景中,我们并不需要大半 ...
- PostgreSQL 大对象导出报错问题分析
1.前言 在处理用户问题过程遇到一个问题.用户通过pg_dump导出 bytea 对象时,当行的大小超过 1G时,会报错: [v8r6c5b41@dbhost01 ~]$ sys_dump -t t1 ...
- KingbaseES R3 集群cluster日志切割和清理案例
案例说明: 对于KingbaseES R3集群的cluster日志默认系统是不做切割和清理的,随着运行时长的增加,日志将增长为一个非常大的文件,占用比较大的磁盘空间,并且在分析问题读取大文件时效率很低 ...
- IK分词器实现原理剖析 —— 一个小问题引发的思考
前言: 网上很多的文章都建议在使用IK分词器的时候,建立索引的时候使用ik_max_word模式:搜索的时候使用ik_smart模式.理由是max_word模式分词的结果会包含smart分词的结果,这 ...
- 输入法词库解析(三)紫光拼音词库.uwl
详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...
- axos在async模式下如何中断请求
main.js import axios from 'axios' Vue.prototype.$http = axios Test.vue <template> <div clas ...
- Java根据Freemarker模板生成Word文件
1. 准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...
- Django 之视图层
JsonResponse 1 json格式的数据有什么用 前后端数据交互需要使用json作为过渡,实现跨语言传输数据 2 前后端方法对应 JSON.stringify() - json.dumps( ...