C# 使用ILogger接口编写日志

2980f37ce4b2326fb386df1c0a4ae6b3.png

.NET 有几种不同的日志记录和跟踪工具,还有许多不同的第三方日志记录程序。尝试将一个应用程序从一种日志记录技术更改为另一种日志记录技术不是一件容易的事情,因为日志记录 API 的使用分布在整个源代码中。要使日志记录独立于任何日志记录技术,可以使用接口。

c3451c3c8768fe510f253c6743e8800f.png

.NET Core 在NuGet 包 Microsoft.Extensions.Logging 中嵌入了泛型 ILogger接口。这个接口定义了 Log 方法。Log 方法定义了参数,来指定 LogLevel(枚举值)、事件ID(使用结构 EventId)、泛型状态信息、记录异常信息的 Exception类型,以及用字符串确定输出格式的格式化程序:

void Log<TState>(LogLevel logLevel, EventId eventide, TState state, Exception exception, Func<TState, Exception, string> formatter)

085df95ee28f0d61731a66c0288af847.png

除了 Log 方法之外,ILogger 接口还定义了 IsEnabled 方法,以基于 LogLevel检查日志记录是否启用,该接口也定义了方法 BeginScope,为日志记录返回可释放的作用域。ILogger 接口中的成员实际上是日志记录所需的全部。Log 方法有许多需要填充的参数。为了简化日志记录,在 LoggerExtensions 类中定义了 ILogger 接口的扩展方法。扩展方法,例如LogDebug、LogTrace、LogInformation、LogWarning、LogError、LogCritical 和 BeginScope 都有几个重载版本和易于使用的参数。

3dcfe9389d818e1ab33c5a1d4b1b0821.png

下面利用依赖注入,并使用包含的类 SampleController 作为一个泛型参数,注入ILogger 接口。泛型参数定义了日志记录器的类别。在泛型参数中,类别是由类名组成的,包括名称空间:

class SampleController
{private readonly ILogger<SampleController> _logger;public SampleController(ILogger<SampleController> logger) {_logger = logger;}//...
}

a5ddf17149399c682aae1b2037807773.png

日志示例是使用了以下依赖项和名称空间:

依赖项

Microsoft.Extensions.DependencyInjection 
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Configuration 
Microsoft.Extensions.Logging.Console 
Microsoft.Extensions.Logging.Debug
Microsoft.Extensions.Logging.EventSource 
Microsoft.Extensions.Logging.Filter

名称空间

Microsoft.Extensions.DependencyInjection 
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console
System
System.Net.Http
System.Threading.Tasks

774f45012ef51b7a69ac2047f8134da5.png

ILogger 接口可以简单地用于调用扩展方法,如 LogInformation:

_logger.LogInformation("NetworkRequestSample started");

69a09d89baddfeb3a4d3bf396a2cc11a.png

扩展方法提供重载版本,来传递额外的参数、异常信息和事件ID。为了使用事件ID,应用程序定义了一个常量值列表:

class LoggingEvents
{public const int Injection = 2000; public const int Networking = 2002;
}

e42f5fd78ba7bf6c775191e40375a728.png

接下来,使用LogInformation和LogError扩展方法显示NetworkRequestSampleAsync 方法的开头、结束时间以及抛出异常时的错误信息:

public async Task NetworkRequestSampleAsync(string url)
{try{_logger.LogInformation(LoggingEvents.Networking,"NetworkRequestSampleAsync started with url {0}", url); var client = new HttpClient();string result = await client.GetStringAsync(url); _logger.LogInformation(LoggingEvents.Networking,"NetworkRequestSampleAsync completed, received {0} characters", result.Length);}catch (Exception ex){logger.LogError(LoggingEvents.Networking, ex,"Error in NetworkRequestSampleAsync, error message: {0},HResult: {1}",ex.Message, ex.HResult);}
}

66fb101d329840149985017af3953199.png

注意:

ILogger 扩展方法的一个重载版本需要给第一个参数使用 EventId。在示例代码中,传递一个 int。这是可能的,因为 EventId 结构实现了一个隐式运算符,来将 int 转换为 EventId。

将消息传递给 LogXX 方法时,可以提供任何数量的的对象,并将其放入格式消息字符串中。此格式字符串使用位置参数传入以下对象。不能使用可格式化的字符串 名因为格式字符串通常来自允许这些消息本地化的资源。

42aaec13dfb8dae079bf027549070ca1.png

35a7f273b5ace119d37ee7985b647a4c.png

 微信公众号 

DotNet讲堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html页面调用php常量,js中的常量变量以及html文档三种引入js的方式

js 是基于事件驱动的异步单线程的脚本编程语言&#xff0c;它的全称是 JavaScript&#xff0c;虽然里边有个 java 字样&#xff0c;但是和 java 编程语言一点关系都没有。它是一种脚本语言&#xff0c;基于解释器执行&#xff0c;它是边解释便执行的语言。浏览器控制台 Console…

【ArcGIS风暴】基于ArcGIS空间分析功能研究渭河流域镇驻地空间分布格局

【内容提要】:基于ArcGIS平台,借助空间分析的方法,用空间平滑法(基于移动搜索法FAC和核估计)分析渭河流域镇驻地的分布特征。 实验过程 1. 加载数据 渭河流域的居民点(Resident_point.shp),DEM(等高线)、水系(线)、道路(线)空间数据,如下图所示。

基于iSroll 5.0实现的上拉加载和下拉刷新插件

Updownload.js 基于iSroll 5.0实现的上拉加载和下拉刷新插件 移动端效果比较好&#xff0c;开发者工具打开后&#xff0c;需要刷新下页面。 [演示地址:] https://chenyk2016.github.io/upDownLoad/demo.html [github地址:] https://github.com/chenyk2016/upDownLoad/ 效果图 1…

[小白进] 大佬们学习为什么简单?小白该如何学习?学历不高如何找工作?副业很好赚?了解后少走弯路

一、前言 对于新手来说&#xff0c;最开始学习编程的难度不亚于学天书&#xff0c;那为什么有经验的程序员在接触一门新技术时能够快速的上手并且完成一些需求的开发呢&#xff1f; 有些人可能看了这个问题觉得我在说废话&#xff0c;“有经验那不快那怎么才快&#xff1f;”…

Chrome如何离线安装crx文件

2019独角兽企业重金招聘Python工程师标准>>> 在Chrome浏览器的谷歌网上应用商店Chrome Web Store上点击应用安装按钮「添加至Chrome」&#xff0c;变成下载文件。把下载文件一拖进浏览器也不能安装。下面是如何离线安装crx文件的方法&#xff1a; ①点击Google Chr…

基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

《看聊天记录都学不会C语言?太菜了吧》(12)循环有多容易?你看一眼就怀...

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

***ECharts图表入门和最佳实践

ECharts数据图表系统&#xff1f; 5分钟上手&#xff01; 【ECharts简介】 ECharts开源来自百度商业前端数据可视化团队&#xff0c;基于html5 Canvas&#xff0c;是一个纯Javascript图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数…

WPF|一个比较简单带点设计的登录界面

阅读目录效果展示准备简单说明 源码结尾&#xff08;视频及源码仓库&#xff09;1. 效果展示欣赏效果&#xff1a;2. 准备创建一个WPF工程&#xff0c;比如站长使用 .NET 7[1] 创建名为 Login5 的WPF项目。找一张图片做为装饰&#xff0c;放登录表单左侧&#xff1a;添加Nuget…

Android插件基础之类加载器学习

记录学习java 加载器学习所获心得&#xff0c;逐步记录了解java加载器的过程。为了知悉android 插件化的实现原理&#xff0c;从而需要从头了解android加载apk&#xff0c;以及基础的java类加载的加载过程情况&#xff0c;为方便记录和记忆&#xff0c;故此将学习了解的过程记录…

《看聊天记录都学不会C语言?太菜了吧》(13)(9*9 乘法表)寻找电脑中的盲盒彩蛋

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

Fragment使用--文章集锦

android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态Android Fragment 真正的完全解析&#xff08;上&#xff09;Android Fragment实践(一)纠正对Fragment Transaction BackStack的误解多个Fragment 切换时不重新实例化Fragment详解之四——管理Fragm…

使用 Postman 实现 API 自动化测试

1背景介绍 相信大部分开发人员和测试人员对 postman 都十分熟悉&#xff0c;对于开发人员和测试人员而言&#xff0c;使用 postman 来编写和保存测试用例会是一种比较方便和熟悉的方式。但 postman 本身是一个图形化软件&#xff0c;相对较难或较麻烦&#xff08;如使用 …

php json -gt;访问,【转】Php+ajax+jsonp解决ajax跨域问题

首先&#xff1a;jsonp是json用来跨域的一个东西。原理是通过script标签的跨域特性来绕过同源策略。发送端&#xff1a;$.ajax({type : "post",url : "ajax.php",dataType : "jsonp",jsonp: "callback",//传递给请求处理程序或页面的&…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(1)加载Python神器!亮剑!

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

Codeigniter 3 拓展HMVC

2019独角兽企业重金招聘Python工程师标准>>> 在Codeiniter&#xff08;以下统称CI&#xff09; 2.X版本中&#xff0c;我们就通过拓展核心类库实现了HMVC&#xff0c;但是同样的代码&#xff0c;拿到CI 3中&#xff0c;就很有可能不好用了。 ###拓展核心类库方式 官…

玩转ASP.NET Core 6.0框架-序言

ASP.NET Core是微软提供的强大的web框架&#xff0c;它有很多潜在的强大而有用的功能。本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来&#xff0c;让您能够按需定制ASP NET Core框架。本专栏提供了一种具体的操作和实现方法&#xff0c;可以让你在短时间尽可能地提高…

从C#开始的面向对象编程经典自学教程

1、C语言的时代 在C语言时代,可以认为那时的编程过程就是表格加工过程,也就是从A表格到B表格、再到C表格…..等等,这个过程中,计算机语言如何描述一个表格,成为计算机语言的关键。 对一个表格的分析可以发现:表格是两部分组成:表头和表格: 学生表 STUDENT 在这个表格…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(2)在python中加号竟然如此善变

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群

1、MySQL集群的作用&#xff1a;- 解决访问节点的单点故障- 数据存储节点的单点故障- 解决数据存储节点数据备份问题2、集群&#xff1a;使用一组服务器提供相同的服务3、关于MySQL-Cluster&#xff1a;MySQL官方提供的集群版本已集成标准版MySQL程序&#xff0c;可独立安装使用…