2011-05-20 100 views
3

记录Web应用程序的http请求(包括ajax请求)的最佳方式是什么,以便我稍后可以返回并查询“我想知道这个请求被创建多少次,以及多长时间平均完成时间“或”向我展示平均时间最高的5个请求“记录请求的时间

您是否会使用当前生产数据库的单独数据库来记录这些内容以防止所有这些插入操作导致IO减速,或者这最终不会产生太大的影响吗?

你会批量提出请求,然后推送到数据库,或者你会为每个请求做一次插入吗?

有没有更好的方式来增加这一要求与定时登录,除了在应用逻辑环绕每个请求的处理程序,如:

start = CurrentTime() 
/* request handler code */ 
end = CurrentTime() 
Insert(requestName, start, (end - start)) 
+0

你有什么服务器环境? – IanT8 2011-05-30 08:55:48

回答

4

您应该可以使用您的Web服务器日志来达到此目的。 Apache和IIS记录捕获URL,查询字符串,响应代码和持续时间。如果AJAX请求通过HTTP POST接收数据,您将需要更改Web服务器的配置以捕获那些对您很重要的数据。然后,我发现的用于日志分析的最佳工具是Microsoft's Log Parser,它在使用SQL语法处理大文件方面做得非常出色,可以计算出您所问的各种问题的答案。

但是,如果您打算自己动手,请使用某种本地日志记录。并使用日志框架(如log4J),该框架足够智能,可缓冲磁盘写入以最大限度地减少I/O,滚动日志文件并删除旧文件。这对于集群服务器来说是更具可扩展性的方法,否则每个都会不断打击数据库。如果你想把数据放在一个表中,那么把它作为一个批处理过程,例如一个小时或一天。

2

似乎是一个极好的用例为谷歌分析(见event tracking,在特定)。

如果这不是一种选择,想想早期的可扩展性:

  1. 不要从你服务的服务器页面内登录,因为这可以结束了对缓存的工作。使用脚本或1x1图像来折叠参数,并使其在单独的(非缓存)进程中运行。

  2. 避免锤击硬盘驱动器,如果你最终使其基于数据库。使用基于内存的存储来存储统计信息,并定期将其内容保存到数据库中。 (回想一下,谷歌Analytics(分析)是不知所措,当谷歌最初打开了它。)

+0

+1图像创意 – orangepips 2011-05-28 10:05:31

1

如果你的目标是简单地跟踪请求的时间,并将它们保存到一个数据库,但是你不希望插入到可能陷入瘫痪你的请求,那么你应该使用支持高速插入的数据库,如MongoDB。如果您将连接字符串调整为strict mode = off,则插入基本上是异步的。

这里是一个很好的起点:

The NoSQ LMovement, LINQ, and MongoDB

如果你这样做了ASP.NET MVC只,那么你可以把那个连同自定义操作过滤器,并把它弄出来你的控制器代码也是如此。我想你也可以通过一个自定义的ASP.NET模块来实现这一点,并获得IIS 7+中的所有请求(甚至是非ASP.NET)。

如果NoSQL/MongoDB不是你的东西,你可以使用SqlCommand.BeginExecuteNonQuery来插入,而不是使其成为阻塞调用。如果您插入与生产相同的数据库,尽管您可能会在该处引发争用。