如何为api所有的请求和响应做一个统一的日志记录

1.创建日志类

public class RequestResponseLog {public string Url { get; set; }public IDictionary<string, string> Headers { get; set; } = new Dictionary<string, string>();public string Method { get; set; }public string RequestBody { get; set; }public string ResponseBody { get; set; }public DateTime ExcuteStartTime { get; set; }public DateTime ExcuteEndTime { get; set; }public override string ToString(){string headers = "[" + string.Join(",", this.Headers.Select(i => "{" + $"\"{i.Key}\":\"{i.Value}\"" + "}")) + "]";return $"\r\n***********************************************************************\r\nUrl: {this.Url},\r\nHeaders: {headers},\r\nMethod: {this.Method},\r\nRequestBody: {this.RequestBody},\r\nResponseBody: {this.ResponseBody},\r\nExcuteStartTime: {this.ExcuteStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff")},\r\nExcuteEndTime: {this.ExcuteEndTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}";}}

2.创建日志中间件

public class RequestResponseLoggingMiddleware {private readonly RequestDelegate _next;private RequestResponseLog _logInfo;public RequestResponseLoggingMiddleware(RequestDelegate next){_next = next;}public async Task Invoke(HttpContext context){_logInfo = new RequestResponseLog();HttpRequest request = context.Request;_logInfo.Url = request.Path.ToString();_logInfo.Headers = request.Headers.ToDictionary(k => k.Key, v => string.Join(";", v.Value.ToList()));_logInfo.Method = request.Method;_logInfo.ExcuteStartTime = DateTime.Now;//获取request.Body内容if (request.Method.ToLower().Equals("post")){//request.EnableRewind(); //启用倒带功能,就可以让 Request.Body 可以再次读取,.net 5弃用request.EnableBuffering(); Stream stream = request.Body;byte[] buffer = new byte[request.ContentLength.Value];//stream.Read(buffer, 0, buffer.Length);   //.net 3.0之后不允许同步读取stream.ReadAsync(buffer, 0, buffer.Length);_logInfo.RequestBody = Encoding.UTF8.GetString(buffer);request.Body.Position = 0;}else if (request.Method.ToLower().Equals("get")){_logInfo.RequestBody = request.QueryString.Value;}//获取Response.Body内容var originalBodyStream = context.Response.Body;using (var responseBody = new MemoryStream()){context.Response.Body = responseBody;await _next(context);_logInfo.ResponseBody = await FormatResponse(context.Response);_logInfo.ExcuteEndTime = DateTime.Now;//Log4Net.LogInfo($"VisitLog: {_logInfo.ToString()}");LogA.SaveInfoToTxtFile($"VisitLog: {_logInfo.ToString()}");await responseBody.CopyToAsync(originalBodyStream);}}private async Task<string> FormatResponse(HttpResponse response){response.Body.Seek(0, SeekOrigin.Begin);var text = await new StreamReader(response.Body).ReadToEndAsync();response.Body.Seek(0, SeekOrigin.Begin);return text;}
}public static class RequestResponseLoggingMiddlewareExtensions {public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder builder){return builder.UseMiddleware<RequestResponseLoggingMiddleware>();}
}

3.日志书写类

public static class LogA {public static void SaveInfoToTxtFile(string info){string bPath = AppContext.BaseDirectory;//如果不存在Log文件夹就创建文件夹if (Directory.Exists(bPath+@".\Log") == false){Directory.CreateDirectory(bPath+@".\Log");}//如果不存在log文件夹下的以年月命名的文件夹就创建file文件夹if (Directory.Exists(bPath+@".\Log\" + DateTime.Now.ToString("yyyyMM")) == false){Directory.CreateDirectory(bPath+@".\Log\" + DateTime.Now.ToString("yyyyMM"));}string fileName = bPath+@".\Log\" + DateTime.Now.ToString("yyyyMM") + "\\" + DateTime.Now.ToString("yyyyMMddHH") + ".txt";StreamWriter sWriter = null;try{sWriter = new StreamWriter(fileName, true, Encoding.Default);sWriter.Write(info);}catch (Exception err){Console.WriteLine("\r\n保存控制台显示的信息 出现异常!" + err.Message);}finally{//如果流不为空,关闭它if (sWriter != null)sWriter.Close();}}
}

4.在starpup.cs中注册中间件

app.UseRequestResponseLogging();

5.完成,收工

asp.net core mvc接口,请求响应统一日志管理相关推荐

  1. 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[中篇]:请求响应

    <200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...

  2. ASP.NET Core MVC请求超时设置解决方案

    设置请求超时解决方案 当进行数据导入时,若导入数据比较大时此时在ASP.NET Core MVC会出现502 bad gateway请求超时情况(目前对于版本1.1有效,2.0未知),此时我们需要在项 ...

  3. 《从零开始学ASP.NET CORE MVC》课程介绍

    大家好,欢迎来到52ABP学院,收看我们的 <从零开始学ASP.NET CORE MVC>. ASP.NET Core 简介 从2015年开始随时互联网成长,云计算和AI.大数据的爆发,大 ...

  4. 用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

    原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...

  5. ASP.NET Core MVC中的两种404错误

    我们在使用某些系统的时候,如果访问了一个不存在的地址怎么办,比如http://52abp. com/airport/fly:或者访问的地址路由和操作方法虽然存在,但是地址参数id不存在,比如https ...

  6. 这本694页的程序员砖头书让你精通ASP.NET Core MVC

    ASP.NET Core MVC是一个来自微软的Web应用程序开发框架,它结合了模型-视图-控制器(MVC)体系结构的有效性和整洁性.敏捷开发的想法和技术,以及.NET平台的最佳部分. 1.1 ASP ...

  7. ASP.NET Core MVC上传、导入、导出知多少

    前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天在研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ...

  8. java 请求响应_java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  9. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

最新文章

  1. transition属性值
  2. 计算机指定共享用户,局域网内共享文件夹给指定计算机
  3. 快速消费品行业的营销费用的管理(2)----营销费用的分类
  4. go日期和时间相关函数使用示例
  5. [中山市选]杀人游戏 (Tarjan缩点)
  6. ADF单位根检验三种形式_质量部来料质量控制:检验程序、检验标准、待检规则、问题处置...
  7. 2019年3月23日
  8. 【numpy】np.random.normal()函数
  9. python安装numba_安装与Python 3.5适配的numba
  10. python for mac下载_Python for Mac
  11. 常用前端Js框架简介
  12. PHP的新手语法介绍
  13. CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin
  14. 现代控制理论——状态、状态空间、状态空间描述
  15. 网易游戏大咖专访丨《第五人格》主创团队畅谈游戏研发修炼记
  16. 腾讯技术分享实录:游戏后台开发九问
  17. 自动统计文件夹下所有音频时长与个数
  18. 人类捕杀动物,吃动物就残忍了吗?
  19. Blender 2.8 白色背景的处理方式
  20. tolower c语言,C 库函数 tolower() 使用方法及示例

热门文章

  1. javascript中打印对象显示[object object]_js如何打印object对象
  2. php8vsgo,服务端 I/O 性能:Node、PHP、Java、Go 的对比
  3. python 文本处理库_推荐8种目前Python使用率最高的文本处理工具
  4. redis5 外部不能连接_【硬见小百科】PCB连接的方法
  5. 将游戏成绩传到排名页面html,用野狗开发实时游戏排行榜
  6. tp5 php正则邮箱,TP5验证器使用实例
  7. UProceduralMeshComponent
  8. java的国际化怎么用_Java有关国际化使用实例
  9. c语言学习自我评价,学习自我评价4篇
  10. java string 类 上机_java上机试题