.NetCore 接口请求耗时记录

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: .NetCore 接口请求耗时记录

通过日志,记录每个接口请求的耗时情况

结合  <logger name="*" level="Trace" writeTo="tracefile"/> 配置使用,NLog 热生效不需要重启服务

增加 RequestLogMiddleware.cs

public class RequestLogMiddleware
{
    /// <summary>
    ///
    /// </summary>
    private readonly RequestDelegate _next;
    /// <summary>
    ///
    /// </summary>
    private readonly Logger logger = LogManager.GetCurrentClassLogger();
    /// <summary>
    ///
    /// </summary>
    /// <param name="next"></param>
    public RequestLogMiddleware(RequestDelegate next, ILogger<RequestLogMiddleware> logger)
    {
        _next = next;
    }
    /// <summary>
    /// 访问日志记录
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public async Task Invoke(HttpContext context)
    {
        //if (_RequestLogOptions != null & _RequestLogOptions.CurrentValue != null & _RequestLogOptions.CurrentValue.Enable)
        {
            var watch = new Stopwatch();
            watch.Start();
            context.Response.OnStarting(() =>
            {
                watch.Stop();
                try
                {
                    //排序 .jpg .css .js 等资源文件
                    if (!context.Request.Path.Value.Contains("."))
                    {
                        var headers = context.Request.Headers;
                        if (headers.ContainsKey("X-Forwarded-For"))
                        {
                            context.Connection.RemoteIpAddress = IPAddress.Parse(headers["X-Forwarded-For"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)[0]);
                        }
                        var ip = context.Connection.RemoteIpAddress.MapToIPv4().ToString();
                        logger.Trace($"{ip}|{context.Response.StatusCode}|{watch.ElapsedMilliseconds}|{context.Request.Method} => {context.Request.Path.Value}{context.Request.QueryString}");
                    }
                }
                finally
                {
                }
                return Task.CompletedTask;
            });
        }
        await _next.Invoke(context);
    }
}
/// <summary>
/// 请求记录中间件扩展类
/// </summary>
public static class RequestLogMiddlewareExtensions
{
    /// <summary>
    /// 添加请求日志记录中间件
    /// </summary>
    /// <param name="builder"></param>
    /// <remarks>
    /// 日志格式 Host ==> ConnectId ==> Scheme ==> Method ==> Path ==> QueryString ==>Response Status ==> Response ContentLength ==> Response Time
    /// 日志记录级别为 Trace
    /// </remarks>
    /// <returns></returns>
    public static IApplicationBuilder UseRequestLogHandler(this IApplicationBuilder builder)
    {
        builder.UseMiddleware<RequestLogMiddleware>();
        return builder;
    }
}

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
【记录】有关接口响应很快,但是在页面渲染的时候发现很慢的问题
【记录】有关接口响应很快,但是在页面渲染的时候发现很慢的问题
178 0
|
6月前
|
Web App开发 前端开发 网络协议
API 请求慢?这次锅真不在后端
API 请求慢?这次锅真不在后端
|
前端开发 测试技术
【前端验证】记录将发包量作为传参以加速debug的环境优化记录
【前端验证】记录将发包量作为传参以加速debug的环境优化记录
|
3月前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
208 0
|
1月前
|
缓存 网络协议 API
【Azure 环境】请求经过应用程序网关,当响应内容大时遇见504超时报错
应用程序网关的响应缓冲区可以收集后端服务器发送的全部或部分响应数据包,然后再将它们发送给客户端。 默认在应用程序网关上启用响应缓冲,这对于适应缓慢的客户端很有用。
|
3月前
WebApi 接口请求耗时记录
WebApi 接口请求耗时记录
17 0
|
6月前
|
存储 缓存 Java
从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)
从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)
159 1
|
缓存 NoSQL 前端开发
若依系统(分离版)后台接口被调时,代码哪里判断了token是否超时?
若依系统(分离版)后台接口被调时,代码哪里判断了token是否超时?
1113 0
解决.NET Core Ajax请求后台传送参数过大请求失败问题
解决.NET Core Ajax请求后台传送参数过大请求失败问题
|
自然语言处理 算法 数据库
简述数据库执行查询请求的过程
当数据库接收到查询请求后,首先需要对查询语句进行解析。这个过程包括词法分析和语法分析,将查询语句转化为内部数据结构,以便后续处理。
162 0