Чтение данных из текстового файла, написанного за определенный период времени в Python - PullRequest
0 голосов
/ 19 сентября 2018

Чтобы объяснить подробно, у меня есть текстовый файл, в который я записываю некоторые данные из различного числа экземпляров процесса (т.е. может быть от 4 до 16 экземпляров процесса, генерирующих журналы).
Все экземпляры записываются в один файл в следующем формате:

2018-09-07 11:34:47,251 - AppLog - INFO - 
    ******************************************
    Log Report - Consume Cycle jhTyjs-ConsumeCycle
    ******************************************
    Uptime: 144708.62724542618s
    Jobs Run: 16866
    Jobs Current: 1
    Q Avg Read Time: 0
    Q Msgs Read: 0
    Worker Load: ['1.00', '1.00', '1.00']
    ******************************************

2018-09-07 11:37:47,439 - AppLog - INFO - 
    ******************************************
    Log Report - Consume Cycle aftTys-ConsumeCycle
    ******************************************
    Uptime: 144888.81490063667s
    Jobs Run: 16866
    Jobs Current: 1
    Q Avg Read Time: 0
    Q Msgs Read: 0
    Worker Load: ['1.00', '1.00', '1.00']
    ******************************************

  This is an error line which could be generated by any of the instances and can be anything, <br> like qfuigeececevwovw or wefebew efeofweffhw v wihv or any python \n exception or aiosfgd ceqic eceewfi 

2018-09-07 11:40:47,615 - AppLog - INFO - 
    ******************************************
    Log Report - Consume Cycle hdyGid-ConsumeCycle
    ******************************************
    Uptime: 145068.99103808403s
    Jobs Run: 16866
    Jobs Current: 1
    Q Avg Read Time: 0
    Q Msgs Read: 0
    Worker Load: ['1.00', '1.00', '1.00']
    ******************************************

Log Report - Consume Cycle [placeholder]-ConsumeCycle каждого журнала [placeholder] является случайным)
Итак, мой файл состоит избольшое количество журналов в указанном формате, один за другим.Каждый экземпляр генерирует журнал каждые 3 минуты.(т. е. все экземпляры генерируют ровно один журнал за 3 минуты)
Если в каком-либо из экземпляров есть ошибка, они также регистрируют это в одном файле.Таким образом, структура данных совсем не соответствует.

Теперь я должен получить последние зарегистрированные данные, т.е. последние 3 минуты, из всех экземпляров и выполнить с ними некоторые задачи.
Есть ли способ получить данные за последние 3 минуты, записанные в файл журнала (, будь то ошибки или отличные записи в указанном выше формате )?

[ EDIT ] Добавлена ​​строка ошибки между журналами

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Поскольку вы сказали, что файл не становится слишком большим для обработки, вам не нужно ничего сложного, чтобы просеять его (т. Е. Буферизованное чтение сзади) - вы можете просто перебрать весь файл, собрать отдельные записи журнала иотменить те, которые произошли более 3 минут назад.

Это особенно легко, если учесть, что ваши записи явно отличаются друг от друга датой-временем в начале, а ваш формат даты в журнале - ISOФормат -8601 , поэтому вам даже не нужно разбирать дату - вы можете использовать прямое лексикографическое сравнение.

Итак, один из способов сделать это будет:

import datetime

# if your datetime is in UTC use datetime.datetime.utcnow() instead
threshold = datetime.datetime.now() - datetime.timedelta(minutes=3)  # 3m ago
# turn it into a ISO-8601 string
threshold_cmp = threshold.strftime("%Y-%m-%d %H:%M:%S")  # we'll ignore the milliseconds

entries = []
with open("path/to/your.log") as f:  # open your log for reading
    current_date = ""
    current_entry = ""
    for line in f:  # iterate over it line-by-line
        if line[0].isdigit():  # beginning of a (new) log entry
            # store the previous entry if newer than 3 minutes
            if current_date >= threshold_cmp:  # store the previous entry if newer than 3m
                entries.append(current_entry)
            current_date = line[:19]  # store the date of this (new) entry
            current_entry = ""  # (re)initialize the entry
        current_entry += line  # add the current line to the cached entry
    if current_entry and current_date >= threshold_cmp:  # store the leftovers, if any
        entries.append(current_entry)

# now the list 'entries' contains individual entries that occurred in the past 3 minutes
print("".join(entries))  # print them out, or do whatever you want with them

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

0 голосов
/ 19 сентября 2018

Вы можете сделать разделение на

******************************************\n\n

с помощью

record_list = file_Obj.read().split("******************************************\n\n")

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

print(record_list[-1])
...