Как можно обновить настройки логгера таким образом, чтобы избежать возникновения исключения о доступе к файлу в процессе создания нового файла в полночь?
Для настройки TimedRotatingFileHandler в Python необходимо использовать следующий код: ```python import logging from logging.handlers import TimedRotatingFileHandler logger = logging.getLogger() logger.setLevel(logging.DEBUG) handler = TimedRotatingFileHandler(filename='example.log', when='midnight', interval=1, backupCount=7) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) ``` В данном примере создается логгер с TimedRotatingFileHandler, который будет создавать новый файл логов каждую полночь (when='midnight') и хранить до 7 старых файлов (backupCount=7). Чтобы избежать возникновения исключения о доступе к файлу в процессе создания нового файла в полночь, рекомендуется добавить следующую конфигурацию к логгеру: ```python handler.suffix = "%Y%m%d" handler.extMatch = re.compile(r"^\d{8}$") ``` Это позволит TimedRotatingFileHandler создавать новый файл с временным штампом в качестве суффикса и проверять, что файл имеет правильный формат, прежде чем продолжить операцию.
Проблема тут вот в чем. Ротейтинг логов устроен так, что запись идёт в файл, а потом, когда наступает условие из конфига логгинга (время или размер), файл переименовывается с добавлением даты и времени, а запись идёт в новый чистый файл.
В линуксе это не вызывает проблемы из-за более совершенной логики работы файловой системы, но вот у вас в винде случается, например, вот что:
Вы запускаете два (или больше) инстанса джанго, они оба наперебой пишут в файл (если им удаётся), или второй инстанс пытается им завладеть (тут не уверен), а когда наступает время его переименовывать, оказывается, что оригинальный файл захвачен другим процессом.
Вам стоит писать логи отдельно каждым инстансом в отдельные файлы. Например добавьте в формулу, по которой формируется имя лог-файла номер процесса.
Либо не выкаблучивайтесь и пишите логи в stdout, не надо засовывать в сервис лишнюю логику. Пусть логи обрабатываются (фильтруются, ротируются) вне процесса.