2009-07-30 41 views
5

Tôi có một trang web đang chạy ở Django. Frontend là lighttpd và đang sử dụng fcgi để lưu trữ django.Django và fcgi - câu hỏi đăng nhập

tôi bắt đầu quá trình fcgi của tôi như sau:

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

Đối với khai thác gỗ, tôi có một RotatingFileHandler quy định như sau:

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

Việc khai thác gỗ đang làm việc. Tuy nhiên, có vẻ như các tập tin đang quay khi chúng thậm chí không lên đến 10Kb, hãy để một mình 10Mb. Tôi đoán là mỗi cá thể fcgi chỉ xử lý 10 yêu cầu và sau đó sinh sản lại. Mỗi respawn của fcgi tạo ra một tập tin mới. Tôi xác nhận rằng fcgi đang bắt đầu theo id quá trình mới thường xuyên (khó có thể nói chính xác thời gian, nhưng dưới một phút).

Có cách nào để giải quyết vấn đề này không? Tôi muốn tất cả các trường hợp fcgi ghi vào một tệp cho đến khi nó đạt đến giới hạn kích thước, tại thời điểm đó, một vòng quay tệp nhật ký sẽ diễn ra.

Trả lời

6

Như Alex đã nói, ghi nhật ký là an toàn chỉ, nhưng trình xử lý tiêu chuẩn không thể được sử dụng một cách an toàn để đăng nhập từ nhiều tiến trình vào một tệp duy nhất.

ConcurrentLogHandler sử dụng khóa tệp để cho phép ghi nhật ký trong nhiều quy trình.

2

Trong giày của bạn, tôi muốn chuyển sang TimedRotatingFileHandler - Tôi ngạc nhiên rằng các tệp xoay xoay dựa trên kích thước đang đưa ra vấn đề này (vì nó không được để các quy trình đang tạo ra các mục nhật ký), nhưng phiên bản theo thời gian (mặc dù không được kiểm soát chính xác theo thông số bạn muốn) nên giải quyết nó. Hoặc, viết trình xử lý tệp quay của riêng bạn, vững chắc hơn (bạn có thể mất rất nhiều từ các nguồn thư viện chuẩn) mà đảm bảo các quá trình khác nhau không phải là vấn đề (vì chúng không bao giờ nên).

0

Có vẻ như bạn đang sử dụng chế độ mở tệp mặc định chắp thêm ("a") chứ không phải viết ("w"), nếu quá trình tái sinh nó sẽ thêm vào tệp hiện có, sau đó cuộn lại khi kích thước đã đạt đến giới hạn. Vì vậy, tôi không chắc chắn rằng những gì bạn đang nhìn thấy được gây ra bởi quá trình tái sinh CGI. (Điều này tất nhiên giả định rằng tên tập tin vẫn giữ nguyên khi quá trình tái sinh).

Mặc dù gói ghi nhật ký là an toàn chỉ, nó không xử lý truy cập đồng thời vào cùng một tệp từ nhiều quy trình - vì không có cách tiêu chuẩn để thực hiện nó trong stdlib. Lời khuyên thông thường của tôi là thiết lập một quy trình daemon riêng biệt, thực hiện một máy chủ socket và ghi lại các sự kiện đã nhận qua nó để gửi - các quy trình khác sau đó chỉ cần thực hiện một SocketHandler để giao tiếp với trình tiện ích ghi nhật ký. Sau đó tất cả các sự kiện sẽ được serialized vào đĩa đúng cách. Tài liệu Python chứa một số working socket server có thể làm cơ sở cho nhu cầu này.

Các vấn đề liên quan