Чтение из файла журнала в процессе его написания с использованием python - PullRequest
43 голосов
/ 20 июля 2010

Я пытаюсь найти хороший способ прочитать файл журнала в реальном времени, используя python.Я хотел бы обрабатывать строки из файла журнала по одной, как написано.Почему-то мне нужно продолжать пытаться прочитать файл, пока он не будет создан, а затем продолжать обрабатывать строки, пока я не завершу процесс.Есть ли подходящий способ сделать это?Спасибо.

Ответы [ 4 ]

43 голосов
/ 20 июля 2010

Взгляните на этот PDF , начиная со страницы 38, ~ слайд I-77, и вы найдете всю необходимую информацию. Конечно, остальные слайды тоже удивительны, но они конкретно касаются вашей проблемы:

import time
def follow(thefile):
    thefile.seek(0,2) # Go to the end of the file
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1) # Sleep briefly
            continue
        yield line
26 голосов
/ 20 июля 2010

Вы можете попробовать что-то вроде этого:

import time

while 1:
    where = file.tell()
    line = file.readline()
    if not line:
        time.sleep(1)
        file.seek(where)
    else:
        print line, # already has newline

Пример был извлечен из здесь .

5 голосов
/ 15 марта 2016

Поскольку это Python и логи помечены тегами, есть еще одна возможность сделать это.

Я предполагаю, что это основано на Python logger, logging.Handler based.

Вы можете просто создать класс, который получает (именованный) экземпляр средства ведения журнала, и переписать функцию emit, чтобы поместить его в графический интерфейс (если вам нужна консоль, просто добавьте обработчик консоли в обработчик файлов)

Пример:

import logging

class log_viewer(logging.Handler):
    """ Class to redistribute python logging data """

    # have a class member to store the existing logger
    logger_instance = logging.getLogger("SomeNameOfYourExistingLogger")

    def __init__(self, *args, **kwargs):
         # Initialize the Handler
         logging.Handler.__init__(self, *args)

         # optional take format
         # setFormatter function is derived from logging.Handler 
         for key, value in kwargs.items():
             if "{}".format(key) == "format":
                 self.setFormatter(value)

         # make the logger send data to this class
         self.logger_instance.addHandler(self)

    def emit(self, record):
        """ Overload of logging.Handler method """

        record = self.format(record)

        # ---------------------------------------
        # Now you can send it to a GUI or similar
        # "Do work" starts here.
        # ---------------------------------------

        # just as an example what e.g. a console
        # handler would do:
        print(record)

В настоящее время я использую аналогичный код для добавления TkinterTreectrl.Multilistbox для просмотра выходных данных регистратора во время выполнения.

Off-Side: регистратор получает данные только после их инициализации, поэтому, если вы хотите, чтобы все ваши данные были доступны, вам нужно инициализировать их в самом начале. (Я знаю, что это то, что ожидается, но я думаю, что стоит упомянуть.)

0 голосов
/ 20 июля 2010

Может быть, вы могли бы сделать системный вызов

tail -f

с использованием os.system ()

...