2015-11-04 68 views
3

我正在研究一個應用程序,其中我可能需要記錄到達服務器的所有通信。該功能可以打開或關閉,也可以在發生異常時使用。登錄異步龍捲風(python)服務器

無論如何,我擔心磁盤I/O操作的阻塞性質及其對服務器性能的影響。在處理請求(主要是POST http請求)時應用的業務邏輯是異步的,因此每個網絡或db調用都是異步執行的。

另一方面,我擔心線程在等待磁盤IO操作完成時的延遲。記錄的消息可以是幾個字節到幾個KB,但在某些情況下是幾MB。當數據寫入磁盤時,並沒有真正需要暫停線程,http請求肯定可以完成,並且沒有理由說ioloop線程在數據寫入磁盤時不能在另一個任務上工作。

所以我的問題是:

  1. 上午我過分擔心這個問題?正在記錄到標準輸出 ,稍後將其重定向到「足夠好」的文件?
  2. 什麼是常用的方法,或者你認爲最適合登錄基於龍捲風的應用程序的方法?即使是簡單的日誌記錄,而不是我上面概述的(極端)情況?
  3. 這基本上是排隊日誌消息並從專用線程消耗它們的理想情況嗎?如果執行磁盤日誌記錄的線程正在等待磁盤io操作完成,那麼linux是否會將日誌記錄卸載到不同的線程(如Homer Simpson的「Can not Someone Else Do it?」)內核將該點作爲上下文切換的機會?

有任何意見或建議,我們非常感激,

埃雷茲

回答

3

對於「正常」的日誌(幾個每請求線),我總是發現,直接記錄到文件不夠好。如果您將所有流量記錄到服務器,則可能並非如此。有一次,我需要做這樣的事情,我只是用tcpdump從外部捕獲流量,而不是修改我的服務器。

如果您想在流程中捕獲它,只需從主線程寫入文件即可。與往常一樣,在採取嚴厲措施之前在自己的環境中測量事物(IOLoop.set_blocking_log_threshold對於確定您的日誌記錄是否有問題很有用)。

如果從主線程塊寫入太長時間,可以寫入由另一個線程處理的隊列,或者異步寫入到另一個進程的管道或套接字(syslog?)。

+0

謝謝,本。這是我正在尋求的那種答案。 – ErezK