Вход из Django под UWSGI - PullRequest
       9

Вход из Django под UWSGI

11 голосов
/ 26 ноября 2010

Я запускаю приложение django через сервер uwsgi и запускаю 32 процесса. Аргументы в моем скрипте инициализации:

ARGS="--pidfile ${PIDFILE} --uid ${UID} -s /tmp/${NAME}.sock --pythonpath ${GCS_HOME}/server/src/gcs --master -w wsgi -d ${GCS_HOME}/logs/uwsgi.log -p 32 -z 30"

Версии: Python 2.6.5, Django 1.2.1, uWSGI 0.9.5.1

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

Обработчик мультилогинга отлично работает в моем простом тестовом приложении, а также когда я запускаю manage.py runserver_plus с werkzeug, но ничего не регистрируется при запуске с django и uwsgi (я не получаю ошибок или исключений из процесса uwsgi либо хотя).

Мой файл wsgi находится ниже, если кто-то может определить проблему с моей конфигурацией или объяснение того, что происходит, я был бы благодарен:

APP_VIRTUAL_ENV = "/home/devadmin/gcs/server/gcs_env/"
APP_PARENT_PATH = "/home/devadmin/gcs/server/src/"

##                                                                              

import sys
# Redirect stdout to comply with WSGI                                           
sys.stdout = sys.stderr

import os, site

# Set the settings module django should use                                     
os.environ['DJANGO_SETTINGS_MODULE'] = "gcs.settings"

# set the sys.path                                                              
site_packages_subpath = "/lib/python%s.%s/site-packages" % (sys.version_info[0]\
, sys.version_info[1], )
site_packages_path = os.path.join(APP_VIRTUAL_ENV, site_packages_subpath[1:])

sys_path = []
for path in sys.path:
    if site_packages_subpath in path and not path.startswith(APP_VIRTUAL_ENV):
        continue
    sys_path.append(path)

sys.path = [ APP_PARENT_PATH ]
sys.path += sys_path
site.addsitedir(site_packages_path)

# reorder sys.path                                                              
for path in sys_path:
    sys.path.remove(path)
sys.path += sys_path

# setup logging                                                                 
import os.path
import logging
import logging.config
logging.config.fileConfig(os.path.join(os.path.dirname(__file__), "logging.conf\
"))

1 Ответ

12 голосов
/ 17 июня 2011

ОТВЕТ ОБНОВЛЕНО - 15 мая 2013 г. - смотрите внизу для дополнительной опции регистрации

Если вы хотите иметь один файл журнала - используйте syslog, пусть он обрабатывает мультиплексирование всех входов в один файл. Несколько процессов, добавляющих в один файл некрасиво, даже с обходными путями многопроцессорности.

Помимо преимущества потокового / процессного «понижающего микширования» различных потоков информации журналирования, вы всегда можете указать удаленный хост, на который вы хотите отправлять журналы, а также это делает ротацию файлов журналов быстрым, поскольку ваш клиенты пишут либо в сокет домена, либо в сокет UDP - им не нужно ждать, пока вы управляете файлами под ними. А еще лучше, вы не потеряете сообщения.

Используемый в сочетании с демоном системного журнала, таким как syslog-ng, вы можете выполнять множество нарезок и кубиков, ретрансляцию сообщений, фильтрацию дублированных сообщений и т. Д.

Короче говоря, syslog лучше, чем управлять своим собственным файлом журнала (на мой взгляд), лучший аргумент против syslog: вы не «владеете» сервером (и, возможно, файлы журнала могут быть недоступны вы).

Если вы хотите быть супер-классным, отправьте свои данные журнала на Splunk, и вы поднимете игру на следующий уровень. Большинство людей используют Splunk для агрегации журналов ИТ, но системный журнал из вашего приложения в splunk - это быстрый путь к удивительным возможностям интеллектуального анализа данных, чтобы понять узкие места в производительности, шаблоны использования и многое другое.

#!/usr/bin/python

import logging
from logging.handlers import SysLogHandler

# Setup
logger = logging.getLogger( "mything" )
hdlr = SysLogHandler( address = '/dev/log', facility = SysLogHandler.LOG_USER )
logger.addHandler( hdlr )
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s')
hdlr.setFormatter( formatter )
logger.setLevel( logging.INFO )


logger.info( 'hello Laverne!' )
logger.debug( 'The Great Ragu has taken ill!' )

НОВЫЙ КОНТЕНТ - 15 мая 2013 г.

Есть еще одна опция, о которой стоит упомянуть, если у вас есть инфраструктура / цепкость для ее настройки - Sentry , которая имеет библиотеки, доступные для Python (а также Javascript и другие), которая обеспечивает централизованное расположение для вас, чтобы отправить ошибки для мониторинга. Это выглядит аккуратно.

...