Где позвонить logging.setLoggerClass () в Джанго - PullRequest
1 голос
/ 17 июня 2011

Я использую Django 1.3 со стандартным журналом Python.Я настроил его для регистрации ошибок в файле:

'loggers': {
    'django': {
        'handlers': ['logfile'],
        'level': 'ERROR',
        'propagate': False,
    },

Я также хочу, чтобы имя пользователя текущего зарегистрированного пользователя Django было зарегистрировано.Для этого я определил свой собственный модуль форматирования с форматом, включающим «% (имя пользователя) s», и создал свой собственный класс ведения журнала (с именем RequestLogger), который заполняет дополнительный атрибут username.Осталось только позвонить:

logging.setLoggerClass(RequestLogger)

Вопрос в следующем: Где мне это назвать? Я пытался поместить его в __init__.py (на уровне проекта)и в settings.py.Обе они прекрасно работают с сервером разработки Django, но при работе в Apache с использованием WSGI в журнале ошибок Apache появляются следующие ошибки:

[error] Traceback (most recent call last):
[error]   File "/usr/lib/python2.7/logging/__init__.py", line 842, in emit
[error]     msg = self.format(record)
[error]   File "/usr/lib/python2.7/logging/__init__.py", line 719, in format
[error]     return fmt.format(record)
[error]   File "/usr/lib/python2.7/logging/__init__.py", line 467, in format
[error]     s = self._fmt % record.__dict__
[error] KeyError: 'username'
[error] Logged from file base.py, line 209

Это, по-видимому, означает, что в WSGI инициализируется регистратор Djangoдо моего logging.setLoggerClass() звонка.(Это определенно вызывается, потому что моя собственная регистрация работает и включает имя пользователя).

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

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

3 голосов
/ 17 июня 2011

Решение Vinay Sajip об использовании фильтра полностью устраняет эту проблему, поэтому я принимаю его ответ.Документация по настройке фильтра с использованием словаря немного отсутствует, поэтому я привожу пример здесь:

LOGGING = {
    ...
    'filters': {
        'add_django_request': {
            '()': 'logger.AddDjangoRequestFilter',
        },
    },
    'handlers': {
        'myhandler': {
            ...
            'filters': ['add_django_request'],
        },
    },

Если кому-то интересно, он работает с пользовательским классом Logger, если вывызовите setLoggerClass внутри файла .wsgi, перед строкой import django.core.handlers.wsgi (для Apache), а также внутри manage.py (для сервера разработчиков Django).Хотя фильтрующий раствор лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...