2010-07-14 1 views
0

Я работаю над сайтом, размещенным на DreamHost, используя Python. Некоторое время я использовал их настройку по умолчанию, которая запускает скрипты Python с использованием CGI. Он работал нормально, но я был обеспокоен тем, что, если я получаю много трафика, он будет работать медленно и использовать много памяти, поэтому я переключил его на FastCGI, используя this module.Видя, что написано на stderr на веб-сайте Python с помощью FastCGI

В целом, он по-прежнему работает нормально, но есть одно серьезное раздражение: я не могу видеть ничего, что записывается в стандартный поток ошибок. Если что-то пойдет не так, мой обычный источник полезных подсказок о том, что делать с ним, больше не работает. Раньше я использовал материал, отправленный стандартной ошибке в мой журнал ошибок Apache. Теперь это просто исчезает.

Я попытался создать тестовый скрипт и написать строки, используя sys.stderr.write (из разных мест) и environment ["wsgi.errors"]. Write (из моего приложения, где environ - первый переданный параметр к приложению с помощью WSGI/FastCGI-обертки). В любом случае, я не мог их найти. Кто-нибудь знает, почему, или как получить доступ к этим данным?

Имейте в виду, что это мой первый раз, когда вы пользуетесь FastCGI, поэтому, пожалуйста, дайте мне знать, если я делаю плохой выбор, используя этот модуль fcgi.

ответ

2

Если что-то в вашей системе захватывает дескриптор файла два («реальный» stderr), вы можете назначить sys.stderr любому открытому, записываемому файловому объекту или файлоподобному объекту (ему в принципе просто нужно реализовать write) - включая экземпляр cStdIO.StdIO, значение которого вы можете получить в любое время (до его закрытия) с вызовом его метода .getvalue().

Чтобы зафиксировать любое неперехваченное исключение перед тем, как он завершит ваш код, назначьте sys.excepthook функцию, в которой вы получаете информацию, и испускаете ее любым способом по вашему выбору; или, чтобы получить и испустить все, что было написано до sys.stderr, даже без исключения (если это то, что вы хотите - я не уверен, из вашего вопроса), используйте atexit, чтобы зарегистрировать свой захват-info-and-emit-it функция.

+0

Цитирование спецификации FASTCGI (http://www.fastcgi.com/drupal/node/6?q=node/22). «У него нет обычных открытых файлов stdin, stdout и stderr, и он не получает много информации через переменные среды». Таким образом, в зависимости от того, использует ли система FASTCGI религиозно, это не может быть вообще stderr. Как говорит Алекс, сопоставьте stderr с чем-то. Самое простое - попробовать sys.stderr = open ("/ tmp/myerrors.log", "w +") 'как самое первое в файле сценария FASTCGI. –

+0

Я попробовал ваше предложение о переназначении sys.stderr, и это сработало. Вроде. Я не могу заставить ошибки обращаться к журналу ошибок, как они привыкли, но это может быть достаточно хорошим для моих целей. Я не пробовал sys.excepthook для этой цели, но я использовал его раньше, и кажется, что это сработает. Я еще не пробовал atexit. –

+1

@mikez, да, я не знаю, как писать из журнала Apache изнутри fastcgi (который я не использую в любом случае - hooray для 'mod_wsgi'! -). Но, записывая в файл, отправляя сообщение об ошибке самому себе, используя модуль 'logging', показывающий журнал ошибок в браузере (для сайтов, еще не находящихся в производстве, только: сайты I_hate_, которые показывают мне большие трассировки, будь то Java или Python или что-то еще, когда у них есть проблема, и я просто пользователь! -) и т. д., есть несколько других возможностей. –

Смежные вопросы