簡體   English   中英

Django和fcgi - 記錄問題

[英]Django and fcgi - logging question

我有一個在Django運行的網站。 前端是lighttpd,正在使用fcgi來托管django。

我開始我的fcgi進程如下:

python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid

對於日志記錄,我有一個RotatingFileHandler定義如下:

file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encoding='utf-8')

記錄正在運行。 但是,當它們甚至沒有達到10Kb時,看起來文件正在旋轉,更不用說10Mb了。 我的猜測是每個fcgi實例只處理10個請求,然后重新生成。 每個重生的fcgi都會創建一個新文件。 我確認fcgi經常在新的進程id下啟動(很難准確地告訴時間,但是在一分鍾之內)。

有沒有辦法解決這個問題? 我希望所有fcgi實例都記錄到一個文件,直到達到大小限制,此時將發生日志文件輪換。

正如Alex所說,日志記錄是線程安全的,但標准處理程序無法安全地用於從多個進程登錄到單個文件中。

ConcurrentLogHandler使用文件鎖定來允許從多個進程內進行日志記錄。

在你的鞋子里,我會切換到TimedRotatingFileHandler - 我很驚訝基於大小的旋轉文件處理正在解決這個問題(因為它應該不會產生哪些進程產生日志條目),但定時版本(盡管不完全控制你喜歡的參數應該解決它。 或者,編寫自己的,更加可靠的旋轉文件處理程序(您可以從標准庫源中獲取很多),以確保不同的進程不是問題(因為它們永遠不應該)。

當你似乎使用默認文件打開模式append(“a”)而不是write(“w”)時,如果一個進程重新生成它應該附加到現有文件,然后在達到大小限制時翻轉。 因此,我不確定您所看到的是由重新生成的CGI流程引起的。 (這當然假設當進程重新生成時文件名保持不變)。

盡管日志記錄包是線程安全的,但它不能處理來自多個進程的同一文件的並發訪問 - 因為在stdlib中沒有標准的方法來執行它。 我的正常建議是設置一個單獨的守護進程,該進程實現套接字服務器並將通過它接收的事件記錄到文件中 - 其他進程然后只實現一個SocketHandler與日志記錄守護進程通信。 然后所有事件將被正確序列化到磁盤。 Python文檔包含一個工作套接字服務器 ,可以作為滿足這種需求的基礎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM