Django и FCGI - вопрос входа - PullRequest
5 голосов
/ 30 июля 2009

У меня есть сайт, работающий в Джанго. Frontend - это 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')

Регистрация работает. Тем не менее, похоже, что файлы вращаются, когда они даже не получают до 10 КБ, не говоря уже о 10 МБ. Я предполагаю, что каждый экземпляр fcgi обрабатывает только 10 запросов, а затем вновь порождает их. Каждое возрождение fcgi создает новый файл. Я подтверждаю, что fcgi запускается с новым идентификатором процесса очень часто (трудно сказать точное время, но меньше минуты).

Есть ли способ обойти эту проблему? Мне бы хотелось, чтобы все экземпляры fcgi регистрировались в одном файле до тех пор, пока он не достигнет предела размера, после чего произойдет ротация файла журнала.

Ответы [ 3 ]

6 голосов
/ 27 января 2010

Как сказал Алекс, ведение журнала является поточно-ориентированным, но стандартные обработчики нельзя безопасно использовать для регистрации нескольких процессов в одном файле.

ConcurrentLogHandler использует блокировку файлов для регистрации в нескольких процессах.

2 голосов
/ 30 июля 2009

На вашем месте я бы переключился на TimedRotatingFileHandler - Я удивлен, что вращающиеся файловые дескрипторы, основанные на размере, создают эту проблему (поскольку она не должна понимать, какие процессы создают журнал записей), но временная версия (хотя и не контролируется на том параметре, который вы предпочитаете) должна решить ее. Или напишите свой собственный, более надежный, вращающийся обработчик файлов (вы можете многое почерпнуть из стандартных библиотечных источников), который гарантирует, что различные процессы не являются проблемой (как и никогда не должно быть).

0 голосов
/ 30 июля 2009

Поскольку вы, похоже, используете режим открытия файла по умолчанию для добавления ("a"), а не для записи ("w"), если процесс повторно запускается, он должен добавить к существующему файлу, а затем переносится при ограничении размера достигнуто Поэтому я не уверен, что то, что вы видите, вызвано повторным порождением процессов CGI. (Это, конечно, предполагает, что имя файла остается тем же самым, когда процесс перезапускается).

Хотя пакет ведения журнала является поточно-ориентированным, он не обрабатывает одновременный доступ к одному и тому же файлу от нескольких процессов - потому что в stdlib нет стандартного способа сделать это. Мой обычный совет - настроить отдельный процесс-демон, который реализует сервер сокетов и регистрирует события, полученные через него, в файл - другие процессы затем просто реализуют SocketHandler для связи с демоном ведения журнала. Тогда все события будут правильно сериализованы на диск. Документация Python содержит рабочий сервер сокетов , который может послужить основой для этой необходимости.

...