Задать вопрос
Hackerman1
@Hackerman1
17 лет, плохое зрение.

Как мне правильно настроить TimedRotatingFileHandler?

У меня есть такие настройки логгера, которые в полночь начинают запись в новый файл.
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{asctime} [{name}] ({module}) {levelname} - {message}",
            "style": "{",
            #"datefmt": "%Y-%m-%d"
        },
        "simple": {
            "format": "{levelname} {message}",
            "style": "{",
        },
    },
    "handlers": {
        "file": {
            "level": "INFO",
            "class": "logging.handlers.TimedRotatingFileHandler",
            "filename": "logs/django.log",
            "when": "midnight",
            "formatter": "verbose"
        },
    },
    "loggers": {
        "django": {
            "handlers": ["file"],
            "level": "INFO",
            "propagate": True,
        },
        "logging_app": {
            "handlers": ["file"],
            "level": "INFO",
            "propagate": True,
        },
        "requests": {
            "handlers": ["file"],
            "level": "INFO",
            "propagate": True,
        },
    },
}

Но джанго выбрасывает мне исключение:
PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'I:\\Programming\\Meme_master_mobile\\meme_master\\logs\\django.log' -> 'I:\\Programming\\Meme_master_mobile\\meme_ma
ster\\logs\\django.log.2024-03-17'


В интернете я много где искал, и на русском и на английском и у чатжпт спрашивал. Я всего один-два таких же кода, как и у меня, нашел на англоязычном стаковерфлоу. В официальной доке используется стандартый FileHandler, без ротейта по интервалу. Тот код, что сверху я взял с другого своего проекта, там он работает спокойно.
  • Вопрос задан
  • 256 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker
Программист, энтузиаст
Проблема тут вот в чем. Ротейтинг логов устроен так, что запись идёт в файл, а потом, когда наступает условие из конфига логгинга (время или размер), файл переименовывается с добавлением даты и времени, а запись идёт в новый чистый файл.
В линуксе это не вызывает проблемы из-за более совершенной логики работы файловой системы, но вот у вас в винде случается, например, вот что:
Вы запускаете два (или больше) инстанса джанго, они оба наперебой пишут в файл (если им удаётся), или второй инстанс пытается им завладеть (тут не уверен), а когда наступает время его переименовывать, оказывается, что оригинальный файл захвачен другим процессом.
Вам стоит писать логи отдельно каждым инстансом в отдельные файлы. Например добавьте в формулу, по которой формируется имя лог-файла номер процесса.
Либо не выкаблучивайтесь и пишите логи в stdout, не надо засовывать в сервис лишнюю логику. Пусть логи обрабатываются (фильтруются, ротируются) вне процесса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы