Определяемые пользователем параметры журнала для приложения 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
Вернуться на верх