Читая несколько файлов с помощью Python, как я могу найти повторение строки ошибки?

Я только начал играть с Python, и я пытаюсь провести несколько тестов в своей среде... Идея состоит в том, чтобы создать простой скрипт, чтобы найти повторение ошибок за определенный период времени.

По сути, я хочу подсчитать, сколько раз сервер отказывал в моих ежедневных журналах, если сбой происходит более определенного числа раз (скажем, 10 раз) в течение определенного периода времени (скажем, 30 дней), я должен быть в состоянии поднять предупреждение в журнале, но я не пытаюсь просто подсчитать повторение ошибок с 30-дневным интервалом... Что я на самом деле хотел бы сделать, так это подсчитать, сколько раз ошибка произошла, восстановлена ​​и они повторялись, таким образом, я бы не стал сообщать более одного раза, если проблема не устраняется в течение нескольких дней.

Например, скажем:

file_2016_Oct_01.txt@hostname@YES
file_2016_Oct_02.txt@hostname@YES
file_2016_Oct_03.txt@hostname@NO
file_2016_Oct_04.txt@hostname@NO
file_2016_Oct_05.txt@hostname@YES
file_2016_Oct_06.txt@hostname@NO
file_2016_Oct_07.txt@hostname@NO

Давая сценарий выше, я хочу, чтобы скрипт интерпретировал его как 2 сбоя вместо 4, потому что иногда сервер может представлять одно и то же состояние в течение нескольких дней до восстановления, и я хочу иметь возможность идентифицировать повторение проблемы вместо простого подсчета общее количество неудач.

Для записи, вот как я прохожу файлы:

# Creates an empty list
history_list = []

# Function to find the files from the last 30 days

def f_findfiles():
    # First define the cut-off day, which means the last number 
    # of days which the scritp will consider for the analysis
    cut_off_day = datetime.datetime.now() - datetime.timedelta(days=30)

    # We'll now loop through all history files from the last 30 days
    for file in glob.iglob("/opt/hc/*.txt"):
        filetime = datetime.datetime.fromtimestamp(os.path.getmtime(file))
        if filetime > cut_off_day:
            history_list.append(file)

# Just included the function below to show how I'm going 
# through the files, this is where I got stuck...

def f_openfiles(arg):
    for file in arg:
        with open(file, "r") as file:
            for line in file:
                clean_line = line.strip().split("@")

# Main function
def main():
    f_findfiles()
    f_openfiles(history_list)

Я открываю файлы с помощью "с" и читаю все строки из всех файлов в "для", но я не уверен, как я могу перемещаться по данным, чтобы сравнить значение, связанное с одним файлом, с более старыми файлами,

Я пытался поместить все данные в словарь, в список или просто перечислять и сравнивать, но у меня не получилось использовать все эти методы:-(

Любые советы о том, что будет лучшим подходом здесь? Спасибо!

1 ответ

Решение

Я бы лучше справился с такими утилитами оболочки (т.е. uniq), но, если вы предпочитаете использовать python:

С минимальным усилием вы можете справиться с этим, создавая соответствующие dict Объект с ключами (например, file_2016_Oct_01.txt@hostname@YES) является ключом. Перебирая журнал, вы проверяете наличие соответствующего ключа в словаре (с помощью if 'file_2016_Oct_01.txt@hostname@YES' in my_log_dict), затем назначьте или увеличьте значение dict соответствующим образом.

Краткий образец:

data_log = {}

lookup_string = 'foobar'
if lookup_string in data_log:
    data_log[lookup_string] += 1
else:
    data_log[lookup_string] = 1

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

data_log[lookup_string] = data_log[lookup_string] + 1 \
    if lookup_string in data_log \
    else 1
Другие вопросы по тегам