3

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

您是否会使用与当前生产数据库不同的数据库来记录这些内容,以防止所有这些插入导致 IO 减慢,或者这最终不会产生很大的影响?

您会批量处理请求然后推送到数据库,还是会为每个请求执行一次插入?

除了将每个请求处理程序包装在应用程序逻辑中之外,还有没有更好的方法来添加此请求登录时间,例如:

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

3 回答 3

4

您应该能够为此目的使用您的 Web 服务器日志。Apache 和 IIS 日志都捕获 URL、查询字符串、响应代码和持续时间。如果 AJAX 请求通过 HTTP POST 接收数据,如果对您很重要,您将需要更改 Web 服务器的配置以捕获该数据。然后,我发现的用于日志分析的最佳工具是Microsoft 的 Log Parser,它可以很好地处理具有 SQL 语法的大文件,以计算您所问问题的答案。

但是,如果您打算自己滚动,请使用某种本地日志记录。并使用日志框架(例如log4J),它足够智能,可以缓冲磁盘写入以最小化 I/O、滚动日志文件和删除旧文件。对于集群服务器来说,这是一种更具可扩展性的方法,否则每个服务器都会不断地访问数据库。如果要将数据放入表中,请将其设为批处理,例如每小时或每天一次。

于 2011-05-28T10:18:55.373 回答
2

似乎是谷歌分析的一个很好的用例(特别是参见事件跟踪)。

如果这不是一个选项,请尽早考虑可扩展性:

  1. 不要从您正在服务的服务器页面中登录,因为这最终会影响缓存。使用脚本或 1x1 图像来折腾参数,并使其在单独的(非缓存)进程中运行。

  2. 如果您最终使其基于数据库,请避免敲打您的硬盘。使用基于内存的存储来存储统计数据,并定期将其内容保存到您的数据库中。(回想一下,当谷歌最初打开它时,谷歌分析不堪重负。)

于 2011-05-23T15:13:26.603 回答
1

如果您的目标是简单地跟踪请求的时间并将它们保存到数据库,但您不希望插入可能会阻碍您的请求,那么您应该使用支持高速插入的数据库,例如MongoDB。如果将连接字符串调整为严格模式 = off,则插入基本上是异步的。

这是一个很好的起点:

NoSQ LMovement、LINQ 和 MongoDB

如果您仅通过 ASP.NET MVC 执行此操作,那么您可以将其与自定义操作过滤器放在一起,并将其从您的控制器代码中取出。我想您也可以使用自定义 ASP.NET 模块来实现这一点,并在 IIS 7+ 中获取所有请求(甚至是非 ASP.NET)。

如果 NoSQL / MongoDB 不是您的菜,您可以使用 SqlCommand.BeginExecuteNonQuery 进行插入,而不是使其成为阻塞调用。如果您插入到与生产相同的数据库中,尽管您可能会在那里引起一些争用。

于 2011-05-26T19:46:34.087 回答