.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

.NET 6 中的 Http Logging 中间件相关推荐

  1. nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园

    nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的: http://host[:port][path] h ...

  2. 在Ocelot中使用自定义的中间件(二)

    在上文中<在Ocelot中使用自定义的中间件(一)>,我介绍了如何在Ocelot中使用自定义的中间件来修改下游服务的response body.今天,我们再扩展一下设计,让我们自己设计的中 ...

  3. 在ASP.NET Core中编写合格的中间件

    这篇文章探讨了让不同的请求去使用不同的中间件,那么我们应该如何配置ASP.NET Core中间件?其实中间件只是在ASP.NET Core中处理Web请求的管道.所有ASP.NET Core应用程序至 ...

  4. ASP.NET Core中HTTP管道和中间件的二三事

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:中间件是什么?在.NET Core中的工作原理又是怎样的呢? 配置ASP.NET Core请求(Request)处理管道 ...

  5. scrapy中的下载器中间件

    下载中间件 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和response的一个轻量.底层的系统. 编写下载器中间件 1 ...

  6. asp向不同的用户发送信息_ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  7. 如何在 ASP.NET Core 中使用 URL Rewriting 中间件

    URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...

  8. ASP.NET Core 中基于工厂的中间件激活

    IMiddlewareFactory/IMiddleware 是中间件激活的扩展点. UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware. 如果是,则使用在容器 ...

  9. 在Ocelot中使用自定义的中间件(一)

    Ocelot是ASP.NET Core下的API网关的一种实现,在微服务架构领域发挥了非常重要的作用.本文不会从整个微服务架构的角度来介绍Ocelot,而是介绍一下最近在学习过程中遇到的一个问题,以及 ...

  10. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(ASP.NET Core 之 Identity 入门(一),ASP.NET Core 之 Ident ...

最新文章

  1. 分享Leangoo敏捷工具操作视频
  2. JDBC编程的事务处理
  3. instagram api java_如何在没有用户交互的情况下获得instagram access_token(新api)?...
  4. linux下删除带特殊符号文件的方法
  5. Python基础教程:属性值设置和判断变量是否存在
  6. 数学--数论--(逆元)扩展欧几里求解+证明
  7. Linux内核哈希表分析与应用
  8. MediaPlayer的错误修复
  9. NetCore Get Parameter
  10. 网站开发常用链接信息
  11. C#:System.Data.SQLite数据库介绍
  12. 编程学习视频网站汇总
  13. 机器学习大作业---文献综述
  14. 0X0000007B蓝屏
  15. 7个实用的Python自动化代码,别再重复造轮子了
  16. Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码
  17. 系统架构演变和远程调用
  18. 高仿360云盘android端的ui实现,(原创)高仿360云盘android端的UI实现
  19. 【2019春招】平安科技开发实习生面经
  20. 电磁阀怎么使用 电磁阀的要求有哪些

热门文章

  1. php获取后缀的文件名,php获取文件名及其后缀方法一览
  2. 计算机ln代表什么意思,ln计算器(log计算器在线)
  3. PCB板沉金工艺和喷锡工艺区别
  4. GEC6818开发板使用和配置
  5. 如何在国外进行自然科学研究
  6. 宾州州立大学帕克分校计算机科学,宾州州立大学帕克分校排名一览
  7. 宾夕法尼亚州立大学将领导 750 万美元的 GaN 辐射效应研究
  8. 苹果系统与win10连接到服务器,Win10下苹果设备连接电脑没有反应的解决方法
  9. 智能陈桥输入法软件测试,智能陈桥输入法无法使用.怎么办?
  10. 海尔电视 android,海尔电视遥控器