WebApi 接口请求耗时记录

简介: WebApi 接口请求耗时记录

.Net Core NLog 配置

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

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

WebApi

Global.asax.cs

protected void Application_Start()
{
  //增加Filter
  FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  FilterConfig.RegisterApiFilters(GlobalConfiguration.Configuration.Filters);
}

Filter

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
    public static void RegisterApiFilters(HttpFilterCollection filters)
    {
        filters.Add(new ApiAciontFilter());
    }
}
public class ApiAciontFilter : System.Web.Http.Filters.ActionFilterAttribute
{
    private const string Key = "__action_duration__";
    public override void OnActionExecuting(HttpActionContext actionContext)
    { 
        var stopWatch = new Stopwatch();
        actionContext.Request.Properties[Key] = stopWatch;
        stopWatch.Start();
    }
    public override void OnActionExecuted(HttpActionExecutedContext filterContext)
    {
        try
        {
            if (!filterContext.Request.Properties.ContainsKey(Key))
            {
                return;
            }
            var stopWatch = filterContext.Request.Properties[Key] as Stopwatch;
            if (stopWatch != null)
            {
                stopWatch.Stop();
                var clientIp = GetIPAddress(filterContext.Request);
                string msg = string.Format("{0}, {1}, {2}, {3} MS", clientIp, filterContext.Response.StatusCode, filterContext.Request.RequestUri.AbsolutePath, stopWatch.ElapsedMilliseconds);
                NLog.LogManager.GetCurrentClassLogger().Trace(msg); //正常日志输出 
            }
        }
        catch (Exception e)
        {
            NLog.LogManager.GetCurrentClassLogger().Error(e, e.Message);
        }
    }
    public static string GetIPAddress(HttpRequestMessage request)
    {
        string ip = "";
        try
        {
            if (request.Properties.ContainsKey("MS_HttpContext"))
            {
                ip = ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
            }
        }
        catch (Exception ex)
        {
        }
        if (ip == "::1") ip = "127.0.0.1";
        return ip;
    }
}

 

目录
相关文章
|
9月前
|
Web App开发 前端开发 网络协议
API 请求慢?这次锅真不在后端
API 请求慢?这次锅真不在后端
119 0
|
22天前
|
Java 应用服务中间件 Spring
SpringBoot 响应请求是串行还是并行?
Spring Boot 在默认情况下通过 Servlet 容器的线程池实现并行处理 HTTP 请求。通过适当的线程池配置,可以进一步优化并发性能。此外,Spring Boot 提供了异步处理机制(如使用 `@Async` 注解)和反应式编程模型(Spring WebFlux),使得应用能够处理更高的并发负载。在具体项目中,可以根据需求选择合适的处理模型,以充分利用 Spring Boot 的并发处理能力。
55 21
|
Android开发
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
1105 0
|
6月前
.NetCore 接口请求耗时记录
.NetCore 接口请求耗时记录
60 0
|
6月前
|
Java
SpringBoot 拦截器 统一日志 记录用户请求返回日志
SpringBoot 拦截器 统一日志 记录用户请求返回日志
250 0
登录接口梳理(如何看接口发出那些请求)
登录接口梳理(如何看接口发出那些请求)
|
移动开发 应用服务中间件 Android开发
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
|
9月前
|
JSON 前端开发 JavaScript
关于我认识的请求方式
关于我认识的请求方式有三个
78 0
|
JSON NoSQL 安全
后端如何优雅地处理重复请求/并发请求?
后端如何优雅地处理重复请求/并发请求?
360 0
解决.NET Core Ajax请求后台传送参数过大请求失败问题
解决.NET Core Ajax请求后台传送参数过大请求失败问题