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

 

目录
相关文章
|
8月前
|
Web App开发 前端开发 网络协议
API 请求慢?这次锅真不在后端
API 请求慢?这次锅真不在后端
109 0
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
271 0
|
5月前
.NetCore 接口请求耗时记录
.NetCore 接口请求耗时记录
50 0
登录接口梳理(如何看接口发出那些请求)
登录接口梳理(如何看接口发出那些请求)
|
6月前
|
程序员
后端“timestamp“: “2024-03-20T17:59:01.892+00:00“, “stat,解决的方法,如果你要发get请求,你要添加GetMapping,不写明请求方式,会报错
后端“timestamp“: “2024-03-20T17:59:01.892+00:00“, “stat,解决的方法,如果你要发get请求,你要添加GetMapping,不写明请求方式,会报错
|
6月前
|
前端开发
纯前端模拟后端接口异步获取数据
纯前端模拟后端接口异步获取数据
47 0
|
数据可视化 BI API
如何开放自己的API接口给他人调用并限制请求次数?
你将学到什么? 可以帮助你实现:将自己的API接入到果创云,然后创建子应用给到你的客户或你的开发者进行接口调用,并统计调用次数。平台暂时不支持线上结算,需要自己进行线下接口调用次数的内部结算。
|
移动开发 应用服务中间件 Android开发
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
踩坑记录:请求接口status返回0
|
8月前
|
JSON 前端开发 JavaScript
关于我认识的请求方式
关于我认识的请求方式有三个
72 0
|
JSON NoSQL 安全
后端如何优雅地处理重复请求/并发请求?
后端如何优雅地处理重复请求/并发请求?
341 0