Просмотр того, что пишется в stderr на веб-сайте Python с использованием FastCGI - PullRequest
0 голосов
/ 14 июля 2010

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

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

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

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

1 Ответ

2 голосов
/ 14 июля 2010

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

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

...