Подтвердить что ты не робот

Регистрация в Django под UWSGI

Я запускаю свое приложение django через сервер uwsgi и запускаю 32 процесса -args в моем init script:

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.

Обработчик multilogging отлично работает в простом тестовом приложении, которое у меня есть, а также при запуске manage.py runningerver_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\
"))
4b9b3361

Ответ 1

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

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

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

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

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

Если вы хотите быть супер-потрясающим, отправьте свои данные журнала в splunk, и вы перенесете свою игру на следующий уровень. Большинство людей используют Splunk для агрегации журналов ИТ, но syslogging из вашего приложения в 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 и др.), Который обеспечивает централизованное расположение для отправки ошибок для мониторинга. Он выглядит аккуратно.