Читая несколько файлов с помощью 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