Как изменить формат даты для регистрации в Django? - PullRequest
2 голосов
/ 14 марта 2019

Комментарии в ответе здесь говорят, что вы должны иметь возможность настроить формат даты для входа в Django:

Обратите внимание, что если вы используете метод dictConfig для настройки ведения журнала (например, если вы используете Django), вы можете установить его, используя ключ dict 'datefmt' для средства форматирования. См .: Конфигурация Django Logging, модуль регистрации: Детали схемы словаря

Однако это не работает:

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'django.server': { # duplicate of default for django.server
            '()': 'django.utils.log.ServerFormatter',
            'format': '[{server_time}] {message}',
            'style': '{',
            'datefmt' : '%Y-%m-%d %H:%M:%S'
            }
}

Это тоже не работает:

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'datefmt' : '%Y-%m-%d %H:%M:%S'
            },
}

В обоих случаях я по-прежнему получаю формат даты регистрации по умолчанию:

[13/Mar/2019 21:53:05] "GET / HTTP/1.1" 200 16808

Обратите внимание, что в исходном коде datefmt должен был быть передан и использован, но похоже, что это не так:

https://github.com/django/django/blob/782d85b6dfa191e67c0f1d572641d8236c79174c/django/utils/log.py#L190

Использование Python 3.6 и Django 2.1


Обновление:

Когда я включаю это в мой settings.py, как описано:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[{server_time}] {message}',
            'datefmt' : '%Y-%m-%d %H:%M:%S',
            'style': '{',
        }
}

А затем отредактируйте файл conda//lib/python3.6/site-packages/django/utils/log.py следующим образом:

class ServerFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        self.style = color_style()
        super().__init__(*args, **kwargs)
        print("self.datefmt", self.datefmt)

Я получаю сообщения в своей консоли, которые выглядят так, что указывает на то, что я действительно правильно распространяю datefmt:

$ python manage.py runserver
self.datefmt %Y-%m-%d %H:%M:%S
self.datefmt %Y-%m-%d %H:%M:%S
Performing system checks...

System check identified no issues (0 silenced).
March 13, 2019 - 23:43:50
Django version 2.1.2, using settings 'webapp.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[13/Mar/2019 23:45:14] "GET / HTTP/1.1" 200 16808

Может быть, ошибка связана с этой строкой в ​​django/utils/log.py?

if self.uses_server_time() and not hasattr(record, 'server_time'):
            record.server_time = self.formatTime(record, self.datefmt)

^ Неважно, что я делаю, похоже, что эта проверка никогда не срабатывает, потому что not hasattr(record, 'server_time') всегда оценивается в False, потому что record уже имеет server_time по умолчанию, и, похоже, это из этого раздела кода Джанго в django/core/servers/basehttp.py:

class WSGIRequestHandler(simple_server.WSGIRequestHandler):
...
...
    def log_message(self, format, *args):
        extra = {
            'request': self.request,
            'server_time': self.log_date_time_string(),
        }

Где simple_server.WSGIRequestHandler.log_date_time_string() приходит из пакета wsgiref. Однако этот пакет не содержит никакой ссылки на функцию log_date_time_string(), он, похоже, поступает непосредственно из встроенной библиотеки Python http (conda//lib/python3.6/http/server.py):

def log_date_time_string(self):
    """Return the current time formatted for logging."""
    now = time.time()
    year, month, day, hh, mm, ss, x, y, z = time.localtime(now)
    s = "%02d/%3s/%04d %02d:%02d:%02d" % (
            day, self.monthname[month], year, hh, mm, ss)
    return s

^ Формат даты здесь жестко запрограммирован в библиотеке и не может быть изменен.

Так ... как это все должно работать? Я что-то пропустил? Это какая-то ошибка в Django? Если я не ошибаюсь, нет способа переопределить это datefmt на основании этого?

1 Ответ

2 голосов
/ 14 марта 2019

Это было хорошее, подробное расследование. Убедитесь, что ваше исследование включает в себя трекер билетов Django. Первое попадание при поиске site:code.djangoproject.com datefmt показывает, что это известная ошибка .

В этом билете показан возможный обходной путь - используйте asctime вместо server_time.

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