2016-06-09 3 views
2

При запуске сервера разработки Джанго (./manage.py runserver) все запрашиваемые адреса удобно войти в процесс стандартный вывод, с точным временем и код ответа:регистрировать все запросы в файл Django

[09/Jun/2016 23:35:53] "GET /api/game/ HTTP/1.1" 404 3185 
[09/Jun/2016 23:36:01] "GET /api/game/123/ HTTP/1.1" 404 1735 

Это очень удобно, потому что при анализе вывода вы сразу увидите запрос, соответствующий вашим логах, например:

WARNING:2016-06-09 23:41:27,806:views:7449:140139847718656: No such object in the database: u'123' 
[09/Jun/2016 23:41:27] "GET /api/game/123/ HTTP/1.1" 404 1735 

Я привык работать с uwsgi + Nginx, поэтому я использовал «консольный» обработчик регистрации для всех, а затем начал uwsgi, как это :

exec uwsgi --master --die-on-term --logto /var/log/uwsgi.log 

В результате я получил всю необходимую регистрацию в /var/log/uwsgi.log, записи запроса uwsgi и мои собственные сообщения регистрации.

Теперь я хочу добиться того же результата с помощью Apache + mod WSGI + django. Я хочу, чтобы единственный файл содержал все запросы и все журналы из моего приложения django в одном месте.

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

'handlers': { 
    'file_handler': { 
     'level': DEBUG and 'DEBUG' or 'INFO', 
     'class': 'logging.handlers.RotatingFileHandler', 
     'filename': join(LOG_DIRECTORY, 'api_log.log'), 
     'maxBytes': 1024 * 1024 * 5, # 5 MB 
     'backupCount': 15, 
     'formatter': 'verbose', 
    }, 
}, 
'loggers': { 
    'api': { 
     'handlers': ['file_handler'], 
     'level': DEBUG and 'DEBUG' or 'INFO', 
    }, 
    'django': { 
     'handlers': ['file_handler'], 
     'level': DEBUG and 'DEBUG' or 'INFO', 
    }, 
    'django.request': { 
     'handlers': ['file_handler'], 
     'level': DEBUG and 'DEBUG' or 'INFO', 
    }, 
    'django.db.backends': { 
     'handlers': ['file_handler'], 
     'level': DEBUG and 'INFO' or 'WARNING', 
     'propagate': False, 
    }, 
} 

ли способ достичь Nginx + uwsgi + Джанго поведения журналирования с апача + WSGI + Джанго: Вот часть конфигурации? Или единственный способ сохранить apache access.log и мои журналы в отдельных файлах?

Я предполагаю, что в первом случае это был сервер разработки, который регистрировал запросы, а во втором случае это был процесс uwsgi. Может быть, есть способ сказать WSGIDaemonProcess сделать то же самое?

ответ

3

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

Сказали, что вы попробовали изменить директивы ErrorLog и CustomLog в Apache, чтобы использовать тот же файл?

Когда я использовал mod_wsgi-экспресс с помощью команды:

mod_wsgi-express start-server --access-log --access-log-name application.log --error-log-name application.log 

она генерирующая:

<IfDefine MOD_WSGI_ROTATE_LOGS> 
ErrorLog "|/usr/sbin/rotatelogs \ 
    /tmp/mod_wsgi-localhost:8000:502/application.log.%Y-%m-%d-%H_%M_%S 5M" 
</IfDefine> 
<IfDefine !MOD_WSGI_ROTATE_LOGS> 
ErrorLog "/tmp/mod_wsgi-localhost:8000:502/application.log" 
</IfDefine> 
LogLevel warn 

<IfDefine MOD_WSGI_ACCESS_LOG> 
<IfModule !log_config_module> 
LoadModule log_config_module ${MOD_WSGI_MODULES_DIRECTORY}/mod_log_config.so 
</IfModule> 
LogFormat "%h %l %u %t \"%r\" %>s %b" common 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined 
LogFormat "undefined" custom 
<IfDefine MOD_WSGI_ROTATE_LOGS> 
CustomLog "|/usr/sbin/rotatelogs \ 
    /tmp/mod_wsgi-localhost:8000:502/application.log.%Y-%m-%d-%H_%M_%S 5M" common 
</IfDefine> 
<IfDefine !MOD_WSGI_ROTATE_LOGS> 
CustomLog "/tmp/mod_wsgi-localhost:8000:502/application.log" common 
</IfDefine> 
</IfDefine> 

с результирующим application.log существ:

[Fri Jun 10 07:17:30.845264 2016] [mpm_prefork:notice] [pid 84334] AH00163: Apache/2.4.18 (Unix) mod_wsgi/4.5.2 Python/2.7.10 configured -- resuming normal operations 
[Fri Jun 10 07:17:30.845518 2016] [core:notice] [pid 84334] AH00094: Command line: 'httpd (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:8000:502/httpd.conf -D MOD_WSGI_ACCESS_LOG -D FOREGROUND' 
::1 - - [10/Jun/2016:07:17:36 +1000] "GET/HTTP/1.1" 200 709 
::1 - - [10/Jun/2016:07:17:37 +1000] "GET/HTTP/1.1" 200 709 
::1 - - [10/Jun/2016:07:17:37 +1000] "GET/HTTP/1.1" 200 709 
::1 - - [10/Jun/2016:07:17:38 +1000] "GET/HTTP/1.1" 200 709 
::1 - - [10/Jun/2016:07:17:38 +1000] "GET/HTTP/1.1" 200 709 
[Fri Jun 10 07:17:39.784486 2016] [mpm_prefork:notice] [pid 84334] AH00169: caught SIGTERM, shutting down 

Так технически она должна работать для автономной установки Apache с журналом ошибок и доступа, идущим к одному и тому же f ile, просто установив ErrorLog и CustomLog в тот же файл.

Что касается дополнительного Джанго регистрации может генерировать внутри из-за исключения, вы также понадобитесь:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['console'], 
      'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), 
     }, 
    }, 
} 

Это говорит Django, чтобы умозрительно войти в терминал, который mod_wsgi будет перехватывать и отправить на ошибку Apache log, который с приведенным выше будет комбинированным журналом приложений.

BTW, если вы хотите запустить Apache/mod_wsgi в контейнере, где ведение журнала необходимо перейти на стандартный вывод, не делайте этого самостоятельно. Используйте mod_wsgi-express, поскольку он специально разработан для использования в контейнерах. В этом случае вы бы просто использовать:

mod_wsgi-express start-server --access-log --log-to-terminal 

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

Если вам нужна дополнительная информация или помощь, используйте список рассылки mod_wsgi.

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