asp.net core 日志中间件(LoggerMiddleware)

本文介绍了一款HTTP服务日志中间件,该中间件能够记录Request和Response信息,支持输出请求处理耗时,特别适用于非HTML请求的日志记录。通过使用此中间件,可以有效地监控和分析HTTP服务的运行状况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/// <summary>
    /// HTTP服务日志中间件
    /// <para>支持Request、Response信息输出</para>
    /// <para>支持请求处理耗时输出</para>
    /// </summary>
    public class LoggerMiddleware
    {
        const string _FileName = "请求日志";

        private readonly RequestDelegate _Next;

        /// <summary>
        /// 不记录日志的请求类型
        /// </summary>
        /// <summary>
        /// 日志中间件
        /// </summary>
        /// <param name="next"></param>
        public LoggerMiddleware(RequestDelegate next)
        {
            _Next = next;
        }

        /// <summary>
        /// 请求拦截处理
        /// </summary>
        /// <param name="context">HTTP请求</param>
        /// <returns></returns>
        public async Task InvokeAsync(HttpContext context)
        {
            string fPath = context.Request.Path.ToString().ToLower();
            int fIndex = fPath.LastIndexOf('.');
            if (fIndex > -1)
            {
                if (fPath.Substring(fIndex, fPath.Length - fIndex) != ".html")
                {
                    await _Next(context);
                    return;
                }
            }
            context.Request.EnableBuffering();
            var requestReader = new StreamReader(context.Request.Body);
            var requestContent = requestReader.ReadToEnd();
            StringBuilder fLog = new StringBuilder();
            fLog.AppendLine($"Request:{context.Request.Method}:{context.Request.Path.ToString()}{context.Request.QueryString}");
            fLog.AppendLine($"Request Body:{requestContent}");
            YLog.Append(fLog.ToString(), _FileName, YConst.mFolderName);
            context.Request.Body.Position = 0;

            Stream originalBody = context.Response.Body;
            try
            {
                using (var ms = new MemoryStream())
                {
                    context.Response.Body = ms;
                    var fWatch = new Stopwatch();
                    fWatch.Start();
                    await _Next(context);
                    fWatch.Stop();
                    ms.Position = 0;
                    string responseBody = new StreamReader(ms).ReadToEnd();
                    YLog.Append($"Response Body({fWatch.ElapsedMilliseconds}ms):\r\n{responseBody}", _FileName, YConst.mFolderName);
                    ms.Position = 0;
                    await ms.CopyToAsync(originalBody);
                }
            }
            finally
            {
                context.Response.Body = originalBody;
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值