.NET 6 中的 Http Logging 中间件

.NET 6 中的 Http Logging 中间件

Intro

.NET 6 会引入一个 Http logging 的中间件,可以用来帮助我们比较方便记录请求和响应的信息

Sample

废话不多说,直接来看示例吧

var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers();
var app = builder.Build();app.UseHttpLogging();
app.MapControllers();app.Run();

dotnet run 运行起来项目,然后访问一个接口就可以看到打印出来的 Http logging 的日志了

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]Request:Protocol: HTTP/1.1Method: GETScheme: httpPathBase:Path: /weatherforecastAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Connection: keep-aliveHost: localhost:5084User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7Cache-Control: [Redacted]Upgrade-Insecure-Requests: [Redacted]sec-ch-ua: [Redacted]sec-ch-ua-mobile: [Redacted]sec-ch-ua-platform: [Redacted]Sec-Fetch-Site: [Redacted]Sec-Fetch-Mode: [Redacted]Sec-Fetch-User: [Redacted]Sec-Fetch-Dest: [Redacted]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]Response:StatusCode: 200Content-Type: application/json; charset=utf-8Date: [Redacted]Server: [Redacted]Transfer-Encoding: chunked

默认地,HttpLoggingMiddleware 会记录请求的基本信息(请求地址,协议版本)和请求头信息以及响应状态和响应头信息,对于不在默认列表里的请求头和响应头,值会显示为 [Redacted],如果需要记录这个请求头/响应头的值则需要配置 HttpLoggingOptions,可以在注册服务的时候进行配置,配置示例如下:

builder.Services.AddHttpLogging(options =>
{options.RequestHeaders.Add("Cache-Control");options.ResponseHeaders.Add("Server");
});

修改之后,重新启动并请求我们的服务,日志输出如下:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]Request:Protocol: HTTP/1.1Method: GETScheme: httpPathBase:Path: /weatherforecastAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Connection: keep-aliveHost: localhost:5084User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7Cache-Control: max-age=0Upgrade-Insecure-Requests: [Redacted]sec-ch-ua: [Redacted]sec-ch-ua-mobile: [Redacted]sec-ch-ua-platform: [Redacted]Sec-Fetch-Site: [Redacted]Sec-Fetch-Mode: [Redacted]Sec-Fetch-User: [Redacted]Sec-Fetch-Dest: [Redacted]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]Response:StatusCode: 200Content-Type: application/json; charset=utf-8Date: [Redacted]Server: KestrelTransfer-Encoding: chunked

注意看一下请求头里的 Cache-Control 和响应头里的 Server,原来都是 [Redacted],配置之后就显示正确的值了,如果你要记录自定义的请求头信息,也是类似的配置

接着我们来配置一下记录请求信息和响应信息,可以配置 HttpLoggingOptions 中的 LoggingFields 来指定需要记录哪些信息

builder.Services.AddHttpLogging(options =>
{options.LoggingFields = Microsoft.AspNetCore.HttpLogging.HttpLoggingFields.All;options.RequestHeaders.Add("Cache-Control");options.ResponseHeaders.Add("Server");
});

在上面的基础上增加 LoggingFields 的配置,这里直接配置上所有的信息,此时再来重新请求,查看日志如下:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]Request:Protocol: HTTP/1.1Method: GETScheme: httpPathBase:Path: /weatherforecastHost: localhost:5084User-Agent: dotnet-HTTPie/0.1.1
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]Response:StatusCode: 200Content-Type: application/json; charset=utf-8
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]ResponseBody: [{"date":"2021-09-25T23:40:11.0164783+08:00","temperatureC":37,"temperatureF":98,"summary":"Cool"},{"date":"2021-09-26T23:40:11.0164836+08:00","temperatureC":50,"temperatureF":121,"summary":"Warm"},{"date":"2021-09-27T23:40:11.0164838+08:00","temperatureC":-7,"temperatureF":20,"summary":"Scorching"},{"date":"2021-09-28T23:40:11.016484+08:00","temperatureC":39,"temperatureF":102,"summary":"Freezing"},{"date":"2021-09-29T23:40:11.0164842+08:00","temperatureC":4,"temperatureF":39,"summary":"Balmy"}]

可以看到此时的 response body 也记录下来了

我们再来增加一个 POST 的 API 来验证一下 RequestBody 是不是可以正常记录

[HttpPost]
public IActionResult Post(System.Text.Json.JsonElement element) => Ok(element);

使用 dotnet-httpie 执行 http :5084/weatherforecast name=test

请求一下 API,输出日志如下:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]Request:Protocol: HTTP/1.1Method: POSTScheme: httpPathBase:Path: /weatherforecastHost: localhost:5084User-Agent: dotnet-HTTPie/0.1.1Content-Type: application/json; charset=utf-8Content-Length: 15
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[3]RequestBody: {"name":"test"}
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]Response:StatusCode: 200Content-Type: application/json; charset=utf-8
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]ResponseBody: {"name":"test"}

More

仔细看上面的示例的话会发现一个问题,当要记录 ResponseBody 的时候,Response header 的信息没有被完全记录下来,感觉像是一个 BUG,提了一个 issue 还没回复,感兴趣的可以参考:<https://github.com/dotnet/aspnetcore/issues/36920>

另外感觉这个中间件的日志级别都是 Information 级别的,如果可以根据响应状态来动态配置日志级别就好了,比如说响应状态码大于等于 500 的时候,日志级别记录为 ERROR, 这样就可以有效地去除很多不必要的日志了,提了一个简陋的 PR,有兴趣的可以参考:https://github.com/dotnet/aspnetcore/pull/36873

References

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/HttpLoggingMiddlewareSample/Program.cs

  • https://github.com/dotnet/aspnetcore/blob/v6.0.0-rc.1.21452.15/src/Middleware/HttpLogging/

  • https://github.com/dotnet/aspnetcore/blob/v6.0.0-rc.1.21452.15/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs#L172

  • https://github.com/dotnet/aspnetcore/issues/36920

  • https://github.com/dotnet/aspnetcore/pull/36873

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

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

相关文章

vue限制点击次数_解决vue 按钮多次点击重复提交数据问题

这个其实是一个很细节的问题。 如果我们操作一个按钮&#xff0c;然后在按钮点击的时候绑定事件。事件分为两种情况&#xff1a;•第一种&#xff1a; 不操作数据型•第二种&#xff1a; 操作数据型 点击 这里我们通过控制isDisable 来设置 disabled来控制按钮的点击和不可点击…

Android 开发学习资源

http://www.verycd.com/topics/2892330/http://www.verycd.com/topics/2900036/转载于:https://www.cnblogs.com/chen110xi/archive/2011/12/06/2277493.html

函数的作用域在各浏览器的混乱情况

if(true) {function someFunc(){return 1;};} else {function someFunc(){return 2;};}var notSomeFunc function someFunc(){return 3;};alert(someFunc());FF输出1&#xff0c;表现为存在“块作用域”。 IE6-IE8输出3&#xff0c;这是它处理命名函数表达式时出现bug&#xf…

2020年高考数学试题难吗?历史上最难数学卷不是2003!

全世界只有3.14 % 的人关注了爆炸吧知识不经历风雨怎能知道明天会死得更惨今天&#xff0c;高考拉开大帷幕&#xff0c;数学考试结束的一瞬间&#xff0c;在微博上简直是一片哀嚎今年&#xff0c;延期一个月高考让许多人预测&#xff0c;难度比起非典那一年或许将有增无减&…

深入浅出Docker(三):Docker开源之路

背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展&#xff0c;它的成功缘于国外成熟的开源文化氛围&#xff0c;以及可借鉴的社区运营经验。通过本文详细的介绍&#xff0c;让大家可以全面了解一个项目亦或者一项技术是如何通过开源的方式发展起来的。为了更准确…

android activity解耦,Android与设计模式:用单一职责原则为Activity解耦

一、什么是单一职责原则单一职责原则(SRP&#xff1a;Single responsibility principle)又称单一功能原则&#xff0c;其定义为&#xff1a;一个类&#xff0c;应该只有一个可以导致变化的原因。光看概念一、什么是单一职责原则单一职责原则(SRP&#xff1a;Single responsibil…

python画图程序没有图_python画图 - v0

学了这么多年python了&#xff0c;还一直没有系统地了解过python的画图功能。 每次都是现学现用&#xff0c;但是某些比较紧急的场合&#xff0c;往往就会比较耗时又耗力&#xff0c;因为不成体系&#xff0c;还经常会忘记已经吸纳的新知识。 所以&#xff0c;我决定把这块的画…

利用Azure communication service实现跟Teams同样等级的沟通协作应用

大家都知道Teams是一个非常强大的沟通协作平台&#xff0c;包括聊天&#xff0c;团队协作&#xff0c;会议&#xff0c;以及应用集成等功能&#xff0c;现在在全世界拥有数以亿计的商业用户。作为Teams平台的一个延伸&#xff0c;产品组把一些核心功能变成了一个公开的服务&…

一个入门的学生选课系统

大三的时候写的一个学生选课系统&#xff0c;WinForm 的使用的SQL数据库。主要有学生&#xff0c;老师两类用户&#xff0c;老师查看选择自己课程的学生&#xff0c;学生进行选课&#xff08;只能选5门课&#xff09;&#xff0c;登陆的时候要有登陆错误次数限制超过会锁定&…

python功能选择模块_python – 组合功能和功能模块

您的compose的实现对于python 3.2是有效的,如上述注释所述.你给出的图书馆的大部分功能都是在documentation中写的python等价物.诸如地图和过滤器的功能已经在python中实现,也可以简单地表示为列表推导. Python有一个id函数返回一个对象的身份(作为整数),但是该库的id函数可以表…

1574: [Usaco2009 Jan]地震损坏Damage

1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 425 Solved: 232[Submit][Status][Discuss]Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 < P < 30,000)…

世界上最诡异的画,到底为何让无数人闻风丧胆?

全世界只有3.14 % 的人关注了爆炸吧知识也许只看到标题 &#xff0c;你一定想不到&#xff0c;传说中世界上最诡异的画是这张。《雨中女郎》这是乌克兰画家斯韦特兰娜捷列茨&#xff0c;绘画生涯中重要的一个作品。也许你会说哪里诡异呢&#xff1f;其实很多人看完这幅画以后&a…

谷歌街景新功能——帮警方抓毒贩

“地球上的毒贩子们&#xff0c;谷歌正在看你们呢。”11月11日的《纽约邮报》在题为《谷歌街景帮忙逮住嫌疑毒贩》的报道开篇这样写道。报道援引执法人员的话说&#xff0c;当时三个毒贩在纽约布鲁克林一处街角向人兜售他们的产品时&#xff0c;被谷歌街景拍个正着。 纽约警介绍…

pixel android8,谷歌Pixel 2更多信息:安卓8.1

给HTC手机团队注入11亿美元现金后&#xff0c;已经显示了谷歌要把硬件做下去的决心&#xff0c;特别是自家的Pixel系列&#xff0c;而10月4日新一代Pixel手机将正式来袭。据Android Police最新报道称&#xff0c;谷歌新的Pixel 2代手机将会提供一个新的功能名叫Always-On Song …

tftp 服务器 ip_360Stack裸金属服务器部署实践

女主宣言裸金属特性是一种将物理设备作为资源提供给租户的云计算服务&#xff0c;租户通过该服务可申请、管理和配置相应的物理设备资源&#xff0c;本文将介绍360Stack裸金属服务器的部署实践。PS&#xff1a;丰富的一线技术、多元化的表现形式&#xff0c;尽在“360云计算”&…

设计模式:状态模式

一、引子 状态模式自身结构非常简单——前面刚刚介绍了几个结构比较简单的设计模式&#xff0c;和他们 一样&#xff0c;状态模式在具体实现上留下了可变换的余地。我前面已经介绍过它的孪生兄妹策略模 式了&#xff0c;大家可以两者比较着阅读。本文将会讨论两者的区别。 二、…

python柱状图挨在一起_echarts多个柱状图展示问题(bar都挤到一起了)

设置bar的宽度也不行&#xff0c;增加区间长度也不行展示是这种情况附上option对象{"calculable": true,"dataZoom": [{"end": 50,"show": true,"start": 2,"type": "slider","xAxisIndex": …

织梦首页html在哪儿,dedecms织梦首页去index.html

如果首页中有index.html不利于SEO&#xff0c;蜘蛛用主域名跟踪到你网站的时候结果多了个index.html&#xff0c;结果导致分散了权重解决方法&#xff1a;将根目录下的index.php文件更改为&#xff1a;if(!file_exists(dirname(__FILE__)./data/common.inc.php)){header(Locati…

Google Chrome 总提示flash插件过期,用命令行模式解决

目标那改成&#xff1a;"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --args --allow-outdated-plugins chrome老提示插件已被阻止&#xff1a; chrome://plugins/ 进入插件 选择始终允许转载于:https://www.cnblogs.com/as3lib/p/4396418.html

Windows下的gcc/gc++编译环境配置

最近有很多算法设计的网络大赛&#xff0c;其中大部分的C/C都是采用Linux下的GCC/G编译器。配置GCC编译器大概有这几种途径&#xff1a;装Linux系统、装Linux虚拟机或者在Windows环境下模拟Linux编译环境。这里谈谈有关Windows下模拟Linux编译环境的方法。 说到Windows下模拟Li…