Вход в Python / Django не работает должным образом - PullRequest
5 голосов
/ 30 октября 2019

У меня есть следующая конфигурация обработчика для ведения журнала:

    "handlers": {
      'system_file': {
        'level': 'DEBUG',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': os.path.join(LOG_FOLDER, "all.log"),
        'formatter': 'verbose',
        'when': 'midnight',
        'backupCount': '30',
      }
   }

Теперь, основываясь на этой конфигурации, мои журналы должны вращаться каждую полночь, то есть должны создавать журналы с датой.

В all.log файл, все регистрируется правильно с правильной отметкой времени, но когда происходит ротация, я не вижу все журналы в файлах журналов резервного копирования (файлы журналов предыдущего дня).

Например:

Допустим, сегодня 2019-10-29, файл all.log начинает хранить все журналы с 2019-10-29 00:00: От 00 до 2019-10-29 23: 59: 59.

На следующий день, т.е. на 2019-10-30 (когда произошло бы вращение), когда я иду и проверяю все.log.2019-10-29, он содержит журнал с 2019-10-30 00:00:00 до 2019-10-30 01:00:00, и файл all.log начинает хранить журналы 2019-10-30 с 00:00:00 и далее,Таким образом, в основном все мои файлы резервных копий содержат журнал только на следующий день с 00:00 до 00-01: 00:00.

all.log по состоянию на 2019-10-30

[DEBUG 2019-10-30 00:00:07,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:11,692 cron.py:44] ....
[DEBUG 2019-10-30 00:00:13,679 cron.py:44] ....
.
.
[DEBUG 2019-10-30 00:00:55,692 cron.py:44] ....
[DEBUG 2019-10-30 00:59:58,679 cron.py:44] ....

SERVER SHUTS DOWN HERE AT 1AM AND STARTS STORING LOGS WHEN IT RESTARTS

[DEBUG 2019-10-30 07:00:02,692 cron.py:44] ....
[DEBUG 2019-10-30 07:00:04,679 cron.py:44] ....
.
.
*Till current time*

all.log.2019-10-29

[DEBUG 2019-10-30 00:00:07,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:11,692 cron.py:44] ....
[DEBUG 2019-10-30 00:00:13,679 cron.py:44] ....
.
.
.
[DEBUG 2019-10-30 00:00:52,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:55,692 cron.py:44] ....
[DEBUG 2019-10-30 00:59:58,679 cron.py:44] ....

all.log.2019-10-28

[DEBUG 2019-10-29 00:00:04,463 cron.py:44] .....
[DEBUG 2019-10-29 00:00:09,692 cron.py:44] ....
[DEBUG 2019-10-29 00:00:11,679 cron.py:44] ....
.
.
.
[DEBUG 2019-10-29 00:00:49,463 cron.py:44] .....
[DEBUG 2019-10-29 00:00:52,692 cron.py:44] ....
[DEBUG 2019-10-29 00:59:56,679 cron.py:44] ....

Я использую сервер, который работает по расписанию, сервер выключается в 1:00 и запускается в 7:00. Это единственная причина, по которой я понимаю, почему это странное поведение происходит в 1:00, но я не могу понять, почему это вызовет проблему

Любая помощь приветствуется.

Я использую Django 1.9.7 и Python 2.7.15

1 Ответ

4 голосов
/ 06 ноября 2019

Как уже упоминалось здесь и во многих других местах, вы не можете использовать этот обработчик для одновременной регистрации (и это имеет место с Django, который работает в нескольких потоках).
Потенциально, из-запараллелизм, который они могут переопределить.

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

  • Использовать что-то вроде ConcurrentLogHandler
  • Используйте SysLogHandler (или NTEventLogHandler в Windows)
  • Используйте SocketHandler, который отправляет журналы в отдельный процесс для записи в файл
  • Используйте QueueHandler с multiprocessing.Queue, как указано здесь .

И если вам действительно нужно сделать это, используя базу по времени - вы можете переопределить ConcurrentRotatingFileHandler и_shouldRollover() метод с вашим собственным условием.
Это не идеальный способ, но он должен работать.

Также вы можете взглянуть на проект на GitHub, который работает над решением этой проблемы:

...