Получить метки времени из строк в лог-файле - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть код, который читает все строки из нескольких файлов журнала в каталоге, используя заданный шаблон регулярных выражений:

Вот код:

src_dict = ("/nfs/home/dex/work/xxx/xxx/logs")
pattern = re.compile ('(.*)for exports(.*)')

for passed_files in os.listdir(src_dict):
    files = os.path.join(src_dict, passed_files)
    strng = open(files)
    for lines in strng.readlines():
        if re.search(pattern, lines):
            print lines

Приведенный выше код дает мне все необходимые строки из файла журнала с отметкой времени в конце каждой строки.

./xx.xx.xx.v1.0_Final:2019-01-30 08:34:46.463 -0800 INFO [626] - Program Ended: xx::xx::xxx::xx for exports [... stuff ...] after 00:26:15

..................... и т. д.

Теперь я хочу получить все последние строки, содержащие метку времени, т.е. 00:26:15 (это всегда может быть что-то другое) и рассчитать общее и среднее время для всехвременные метки, собранные из этих файлов журнала.

1 Ответ

0 голосов
/ 11 февраля 2019

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

Для этого используйте "Группы захвата" .

Чтобы получить числа в формате HH:MM:SS, у вас есть две цифры, двоеточие, две цифры, еще двоеточие и еще две цифры.Определить, что это трудно , так что вы, вероятно, просто напишите это точно так:

(\d\d):(\d\d):(\d\d) (если хотите, вы можете {2} эти \d, но для меняэто кажется более сложным).

Обратите внимание на круглые скобки вокруг сопоставителей цифр: они говорят re захватить содержимое отдельно для вас и сделать его доступным как match.group(number), начиная с 1 и match.groups(), aкортеж.Чтобы быть уверенным в совпадении с end строки (не в середине), вы добавляете $ (строго, это не должно быть обязательно, так как .* id "жадный", но это более понятно).

Если вы добавите это к своему регулярному выражению (удалив группы, которые у вас уже есть, если они вам не нужны; учитывайте их в противном случае), вы получите:

pattern = re.compile(r'.* for exports .* (\d\d):(\d\d):(\d\d)$')

Теперь вы можете сопоставить это и получить время для каждого прогона следующим образом: match = pattern.match(logline); seconds = (int(match.group(1))*60 + int(match.group(2))) * 60 + int(match.group(3)


Как я уже говорил выше, количественное определение сложно, но оно может бытьГотово, я знаю о двухэтапном подходе: сначала вы получаете все метку времени, а затем обрабатываете ее отдельно.В этом случае добавленное усложнение слишком велико, но, если у вас есть что-то другое, было бы хорошо иметь в виду:

.*((?:\d{2}:)+\d\d)$ фиксирует любую длину двух цифр, разделенных двоеточиями, вы можетезатем просто .split(':') это и выполните ваши вычисления.


1 это обычно относится к конкретному моменту времени , а не к продолжительности.Чтобы не смущать вас, я использовал «метку времени» в своем ответе.Фактическая отметка времени в выходных данных журнала 2019-01-30 08:34:46.463, а не 00:26:15.

...