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;
    }
}

 

目录
相关文章
|
4月前
|
Web App开发 前端开发 网络协议
API 请求慢?这次锅真不在后端
API 请求慢?这次锅真不在后端
|
4月前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
174 2
|
1月前
.NetCore 接口请求耗时记录
.NetCore 接口请求耗时记录
11 0
|
2月前
|
前端开发
纯前端模拟后端接口异步获取数据
纯前端模拟后端接口异步获取数据
30 0
|
2月前
|
程序员
后端“timestamp“: “2024-03-20T17:59:01.892+00:00“, “stat,解决的方法,如果你要发get请求,你要添加GetMapping,不写明请求方式,会报错
后端“timestamp“: “2024-03-20T17:59:01.892+00:00“, “stat,解决的方法,如果你要发get请求,你要添加GetMapping,不写明请求方式,会报错
|
4月前
|
JSON 前端开发 JavaScript
关于我认识的请求方式
关于我认识的请求方式有三个
54 0
|
4月前
|
缓存 监控 算法
如何处理1688商品详情API的并发请求问题?
并发请求问题是指在多个用户同时对同一资源进行操作时,产生的冲突和竞争条件。在1688商品详情API的应用场景下,多个用户可能同时对同一商品信息进行查询或更新。如果这些操作没有得到合理的协调和处理,就可能导致数据的不一致性和错误。
|
移动开发 应用服务中间件 Android开发
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
|
11月前
|
JSON NoSQL 安全
后端如何优雅地处理重复请求/并发请求?
后端如何优雅地处理重复请求/并发请求?
290 0
|
JSON 前端开发 网络架构
DRF--请求和响应
DRF--请求和响应