.Net Core 请求响应统一日志
全局打印统一的请求响应日志
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Middleware { internal 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: {Url},\r\nHeaders: {headers},\r\nMethod: {Method},\r\nRequestBody: {RequestBody},\r\nResponseBody: {ResponseBody},\r\nExcuteStartTime: {ExcuteStartTime:yyyy-MM-dd HH:mm:ss.fff},\r\nExcuteEndTime: {ExcuteEndTime:yyyy-MM-dd HH:mm:ss.fff}"; return $"\r\n***********************************************************************\r\nUrl: {Url},\r\nHeaders: {headers},\r\nMethod: {Method},\r\nRequestBody: {RequestBody},\r\nExcuteStartTime: {ExcuteStartTime:yyyy-MM-dd HH:mm:ss.fff},\r\nExcuteEndTime: {ExcuteEndTime:yyyy-MM-dd HH:mm:ss.fff}"; } } internal class RequestResponseLoggingMiddleware { private readonly RequestDelegate _next; private RequestResponseLog _logInfo; private readonly ILogger<RequestResponseLoggingMiddleware> _logger; public RequestResponseLoggingMiddleware(RequestDelegate next, ILogger<RequestResponseLoggingMiddleware> logger) { _next = next; _logger = logger; } 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.EnableBuffering(); Stream stream = request.Body; byte[] buffer = new byte[request.ContentLength.Value]; await 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; _logger.LogInformation($"VisitLog: {_logInfo}"); //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>(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具