【问题标题】:Logging Requests With Timing定时记录请求
【发布时间】:2011-08-29 20:59:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你心目中的服务器环境是什么?

标签: web-analytics


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    似乎是 Google Analytics(分析)的绝佳用例(特别是参见 event tracking)。

    如果无法选择,请尽早考虑可扩展性:

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

    2. 如果您最终使硬盘驱动器基于 DB,请避免敲打您的硬盘。使用基于内存的存储来存储统计信息,并定期将其内容保存到您的数据库中。 (回想一下,当 Google 最初打开 Google Analytics 时,它已经不堪重负了。)

    【讨论】:

      【解决方案3】:

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

      这是一个很好的起点:

      The NoSQ LMovement, LINQ, and MongoDB

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-11
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多