.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>();
        }
    }
}
复制代码

 

转载于:asp.net core mvc接口,请求响应统一日志管理

posted @   xYzDl  阅读(341)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示