asp.net mvc 记录Action耗时
可能有些时候需要记录Action的执行时间来优化系统功能,这时可以用过滤器来实现。
新建项目

项目名称随便取

身份验证:不进行身份验证
安装Nlog
这里使用NLog来输出日志,具体使用说明请看:https://github.com/nlog/NLog/wiki(相比log4net文档说明会好很多)
解决方案中右键,选择管理NuGet包

在浏览中输入:"nlog",我使用是VS2015,其它版本类似


选择Nlog.Config的目的是顺便把配置文件也下载了

选择确定

安装时会输出相关信息,没有任何错误就说明成功了
修改配置文件
在ActionTime项目下应该可以看到NLog.config文件,配置文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- shortdate:2017-3-30 level:Error、Info...-->
<variable name="logDirectory" value="${basedir}/Logs/${shortdate}/${level}"/>
<targets>
<target xsi:type="File" name="AllFile" fileName="${logDirectory}/All.log"
layout="${longdate} ■${level}${newline} ▲${stacktrace}${newline} ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline} ◆${message}${newline}${newline}***************************************************************************"
archiveFileName="${logDirectory}/archives/All_${shortdate}.{#####}.log"
archiveAboveSize="1024000"
archiveNumbering="Sequence"
concurrentWrites="true"
keepFileOpen="false"/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="AllFile" />
</rules>
</nlog>
此配置会在项目下新建Logs目录,所有日志文件都存放在里面
例:Logs\2017-03-30\Info\All.Log
新建过滤器类
接着在ActimTime项目中新建一个目录Filters,此目录用来存放自定义过滤器类
在Filters目录下新建一个类TimingActionFilter
public class TimingActionFilter : ActionFilterAttribute
{ private static readonly Logger Log = LogManager.GetCurrentClassLogger(typeof(TimingActionFilter)); //创建字典来记录开始时间,key是访问的线程Id.
private readonly Dictionary<int, DateTime> _start = new Dictionary<int, DateTime>(); //创建字典来记录当前访问的页面Url.
private readonly Dictionary<int, string> _url = new Dictionary<int, string>(); public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//过滤掉ChildAction, 因为ChildAction实际上不是一个单独的页面
if (filterContext.IsChildAction) return; var currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; try
{
_start.Add(currentThreadId, DateTime.Now);
_url.Add(currentThreadId, filterContext.HttpContext.Request.Url == null
? string.Empty
: filterContext.HttpContext.Request.Url.AbsoluteUri);
}
catch (Exception ex)
{
Log.Error(ex.ToString());
}
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
if (!_start.ContainsKey(currentThreadId)) return; try
{ //计算出当前页面访问耗时
var timeSpan = (DateTime.Now - _start[currentThreadId]).TotalMilliseconds;
if (timeSpan > )//如果耗时超过500毫秒,就是用log4net打印出,具体是哪个页面访问超过了500豪秒,具体使用了多长时间。
{
Log.Info(string.Format("运行时间超过500毫秒,共花费{1}毫秒. URL: {0}", _url[currentThreadId], timeSpan));
}
}
catch (Exception ex)
{
Log.Error(ex.ToString());
}
finally
{
_start.Remove(currentThreadId);
_url.Remove(currentThreadId);
}
}
}
修改控制器
打开HomeController,修改Index为如下:
public ActionResult Index()
{
Thread.Sleep();//添加延时
return View();
}
修改FilterConfig
再打开FilterConfig文件,修改代码如下:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new TimingActionFilter());//自己定义的过滤器
}
启动
现在基本工作已经完成,按F5启动项目,可以看到在项目目录下有个Logs目录

查看
打开日志文件内容为如下,一般这种情况把日志写入数据库会比较好分析

Demo:点击下载
asp.net mvc 记录Action耗时的更多相关文章
- 理解ASP.NET MVC Framework Action Filters
		原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ... 
- windows server 证书的颁发与IIS证书的使用    Dapper入门使用,代替你的DbSQLhelper    Asp.Net MVC中Action跳转(转载)
		windows server 证书的颁发与IIS证书的使用 最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ... 
- C# MVC 用户登录状态判断   【C#】list 去重(转载)  js 日期格式转换(转载)  C#日期转换(转载)   Nullable<System.DateTime>日期格式转换 (转载)  Asp.Net MVC中Action跳转(转载)
		C# MVC 用户登录状态判断 来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ... 
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
		原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一. ASP.NET MVC 1.0 Result 几何? Action的 ... 
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
		原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ... 
- ASP.NET MVC的Action Filter
		一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ... 
- Asp.net Mvc之Action如何传多个参数
		最近,工作上有一个需要:用户查询日志文件信息,查看某一个具体日志信息,可能同时查看该日志所在日期的其他日志信息列表. 为完成此功能,我打算在URL中传入了两个参数,一个记录此日志时间,另外一个记录日志 ... 
- 浅谈Asp.net Mvc之Action如何传多个参数的方法
		最近,工作上有一个需要:用户查询日志文件信息,查看某一个具体日志信息,可能同时查看该日志所在日期的其他日志信息列表. 为完成此功能,我打算在URL中传入了两个参数,一个记录此日志时间,另外一个记录日志 ... 
- Asp.net mvc 中Action 方法的执行(二)
		[toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ... 
随机推荐
- 轻松上云,从容实施Office 365项目
			这个是我在MVP 社区活动的一节课程,讲述Office 365部署中一些大的挑战和解决的方法 视频URL 例如以下: http://edu.51cto.com/lesson/id-17440.html ... 
- USACO Section 2.1 Healthy Holsteins
			/* ID: lucien23 PROG: holstein LANG: C++ */ #include <iostream> #include <fstream> #incl ... 
- 翻译:Identifier Qualifiers标识限定符
			*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ... 
- springboot+多数据源配置
			作者:纯洁的微笑 出处:http://www.ityouknow.com/ 起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多 ... 
- bootstrap表格固定表头,表格内容滚动条滚动显示
			直接贴代码--- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ... 
- 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
			<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ... 
- Python 集体智慧编程PDF
			集体智慧编程PDF 1.图书思维导图http://www.pythoner.com/183.html p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12. ... 
- ios 访问隐私信息 info.plist 中的字段
			1.iOS10相册相机闪退bug: iOS10系统下调用系统相册,相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to acc ... 
- python变量字符拼接
			cpu = instances['vcpus_current'] cpu1 = str(cpu) + '核' memory = instances['memory_current'] / 1024 m ... 
- Func和Action委托简单用法
			Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ... 
