Задать вопрос
KorP
@KorP
Кратко о себе

Анализ логов сервера на Python. Зависает скрипт при logrotate, как бороться?

Использую самописный скрипт для анализа некоторых логов. Скрипт в цикле читает лог постоянно и при отработке logrotate (старый лог уходит в архив и появляется новый, чистый файл) - зависает. Как с этим бороться?
Лог читаю вот так
def monitor(file):
    file.seek(0,2)
    while True:
        line = file.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

loglines = monitor(logfile)
for line in loglines
    ....
  • Вопрос задан
  • 1540 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
В вашем случае необходимо не держать лог-файлы непрерывно открытыми. Открыли, считали в буфер доступные строки или n-ое их количество, закрыли. Пауза, повторяем цикл.

Проблема связана с тем, что после ротации дескриптор открытого файла продолжает указывать на старый файл.
Ответ написан
@Reversaidx
Самое очевидное решение , копировать его в темповое место, либо если логи не большие то читать не по строкам а весь файл
Ответ написан
@artinnok
бекенд-программист
Вам стоит заюзать дефолтный пакет logging и TimedRotatingFileHandler - это уже грамотно реализовано и сразу с ротацией логов.

пример конфига:
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "rotate": {"format": "%(levelname)s %(asctime)s %(pathname)s %(lineno)d %(message)s"}
    },
    "handlers": {
        "file_rotate": {
            "level": "DEBUG",
            "class": "logging.handlers.TimedRotatingFileHandler",
            "formatter": "rotate",
            "filename": "/var/log/my_logger.log",
            "when": "midnight",
        }
    },
    "loggers": {
        "my_logger": {
            "level": "DEBUG", 
            "handlers": ["file_rotate"]
        }
    },
}


логи пишете так:
import logging

my_logger = logging.getLogger("my_logger")
my_logger.debug('debug message')
my_logger.info('info message')
my_logger.error('error message')
my_logger.critical('critical message')
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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