некоторые логи django отсутствуют, когда хост в uwsgi с несколькими процессами - PullRequest
7 голосов
/ 09 февраля 2012

Я использую django + uwsgi для веб-проекта. Но я обнаружил, что некоторые журналы django будут отсутствовать после запуска uwsgi некоторое время!

Ситуация такова: я настраиваю uwsgi с 8 процессами. Когда я запускаю uwsgi, все журналы django записываются в один файл журнала. Но через несколько часов некоторые логи не записываются в файл. Я сравнил файл журнала django с файлом журнала uwsgi. Я обнаружил, что в файл django были записаны запросы только одного процесса uwsgi. Журналы django других 7 процессов отсутствовали. Когда я перезагружаю uwsgi, это тот же результат.

Кто-нибудь знает об этом?

Спасибо

моя конфигурация регистрации в django:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'simple': {
        'format': '%(levelname)s %(asctime)s %(message)s'
    },
    'detail': {
        'format': '%(levelname)s %(asctime)s [%(module)s.%(funcName)s line:%(lineno)d] %(message)s',
    },
},
'handlers': {
    'file': {
        'level': 'INFO',
        'formatter': 'simple',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': LOG_FILE,
        'when': 'midnight',
        'backupCount': 366,
    },
    'err_file': {
        'level': 'WARN',
        'formatter': 'detail',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': LOG_ERR_FILE,
        'when': 'midnight',
        'backupCount': 366,
    },
},
'loggers': {
    'django_request': {
        'handlers': ['file', 'err_file'],
        'level': 'DEBUG',
        'propagate': True,
    },
}
}

моя конфигурация uwsgi:

<uwsgi>
<socket>0.0.0.0:8888</socket>
<chdir>src_dir</chdir>
<pythonpath>..</pythonpath>
<module>wsgi</module>
<workers>4</workers>
<processes>8</processes>
<master>true</master>
<pidfile>uwsgi.pid</pidfile>
<enable-threads>true</enable-threads>
<logdate>true</logdate>
<daemonize>/log/uwsgi/uwsgi.log</daemonize>
</uwsgi>

1 Ответ

2 голосов
/ 13 сентября 2012

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

http://docs.python.org/library/logging.handlers.html

/ etc / rsyslog.d / local-myapp.conf:

local0.*                         -/var/log/myapp/app.log

settings.py:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'user': {
            '()': 'core.log.UserFilter',
        }
    },
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(user)s %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(asctime)s %(module)s %(user)s %(message)s'
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['user'],
        },
        'syslog':{
            'level': 'INFO',
            'class': 'logging.handlers.SysLogHandler',
            'formatter': 'verbose',
            'filters': ['user'],
            'facility': 'local0',
            'address': '/dev/log',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
    'root': {
        'handlers': ['syslog'],
        'level': 'INFO',
    }
}

Вы также можете попытаться записать сообщения журнала в консоль и позволить uwsgi записывать журналы самостоятельно.

...