Определяемые пользователем параметры журнала для приложения Django, развернутого на сервере uWSGI
Я развернул приложение Django на сервере uWSGI, который имеет следующее промежуточное программное обеспечение
# myapp/middleware.py
from django.utils.deprecation import MiddlewareMixin
class LogUserMiddleware(MiddlewareMixin):
def process_request(self, request):
request.META['REMOTE_USER'] = 'test'
Промежуточное ПО добавляется также в файл settings.py
# myapp/settings.py
MIDDLEWARE = [
...
'myapp.middleware.LogUserMiddleware',
...
]
Тогда в конфигурационном файле uWSGI также используется logvar
...
log-format = %(ltime) %(addr){uWSGI} : %(method) %(uri) %(status) %(REMOTE_USER)
...
Но в журналах все равно отображается как
19/May/2024:09:01:49 +0000 127.0.0.1{uWSGI} : GET /health_check 200 -
По сути, logvar заменяется на - вместо того, чтобы показывать test
Нужно ли выполнять какие-либо дополнительные настройки?
После некоторых исследований я обнаружил, что uWSGI не принимает logvars, установленные в Middleware приложения Django.
Чтобы использовать пользовательские логвары, мы должны обернуть WSGI-приложение, предоставляемое Django, в наше пользовательское WSGI-приложение.
Сначала создайте пользовательское WSGI-приложение в файле wsgi.py приложения Django так
import os
import uwsgi
from datetime import datetime
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main_folder.settings')
class WSGIApplication:
def __init__(self):
self.app = get_wsgi_application()
def __call__(self, environ, start_response):
current_time = datetime.now()
# noinspection PyUnresolvedReferences
uwsgi.set_logvar('REMOTE_USER','test')
return self.app(environ, start_response)
application = WSGIApplication()
Затем в файле конфигурации сервера uWSGI убедитесь, что опция module установлена в переменную application файла wsgi.py как
chdir = /path/to/project
module = main_folder.wsgi:application
тогда мы можем использовать logvar REMOTE_USER в опции формата журнала в файле конфигурации uWSGI как
log-format = %(ltime) %(addr){uWSGI} : %(method) %(uri) %(status) %(REMOTE_USER)
для получения соответствующих журналов, как
19/May/2024:09:01:49 +0000 127.0.0.1{uWSGI} : GET /health_check 200 test