Как настроить TimedRotatingFileHandler?

Как можно обновить настройки логгера таким образом, чтобы избежать возникновения исключения о доступе к файлу в процессе создания нового файла в полночь?
  • 20 марта 2024 г. 5:59
Ответы на вопрос 2
Для настройки 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, не надо засовывать в сервис лишнюю логику. Пусть логи обрабатываются (фильтруются, ротируются) вне процесса.
Похожие вопросы