2011-05-20 146 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來插入,而不是使其成爲阻塞調用。如果您插入與生產相同的數據庫,儘管您可能會在該處引發爭用。