python: чтение datetime из файла журнала с использованием regex

Вопрос:

У меня есть файл журнала, который имеет такой текст.

Jul  1 03:27:12 syslog: [m_java][ 1/Jul/2013 03:27:12.818][j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7)

В файле есть два временных формата. Мне нужно отсортировать этот файл журнала на основе формата даты, заключенного в [].

Это регулярное выражение, которое я пытаюсь использовать. Но он ничего не возвращает.

t_pat = re.compile(r".*\[\d+/\D+/.*\]")

Я хочу просмотреть каждую строку в файле, уметь применять этот шаблон и сортировать строки на основе даты и времени.

Может ли кто-нибудь помочь мне в этом? Благодарю!

Лучший ответ:

Вы не соответствуете начальному пространству; вы также хотите сгруппировать дату для легкого извлечения и ограничить \D и .* шаблоны неживыми:

t_pat = re.compile(r".*\[\s?(\d+/\D+?/.*?)\]")

Демо-версия:

>>> re.compile(r".*\[\s?(\d+/\D+?/.*?)\]").search(line).group(1)
'1/Jul/2013 03:27:12.818'

Вы можете сузить рисунок еще немного; вам нужно всего лишь сопоставить 3 письма за месяц, например:

t_pat = re.compile(r".*\[\s?(\d{1,2}/[A-Z][a-z]{2}/\d{4} \d{2}:\d{2}:[\d.]{2,})\]")

Ответ №1

У вас есть место, которое должно быть добавлено к регулярному выражению

text = "Jul  1 03:27:12 syslog: [m_java][ 1/Jul/2013 03:27:12.818][j:[SessionThread <]^Iat com/avc/abc/magr/service/find.something(abc/1235/locator/abc;Ljava/lang/String;)Labc/abc/abcd/abcd;(bytecode:7)"
matches = re.findall(r"\[\s*(\d+/\D+/.*?)\]", text)
print matches
['1/Jul/2013 03:27:12.818']

Затем проанализируйте время, используя следующую функцию

http://docs.python.org/2/library/time.html#time.strptime

Наконец, используйте это как ключ в dict, а строку — как значение и сортируйте эти записи на основе ключа.

Ответ №2

Прочитайте все строки файла и используйте функцию sort и передайте функцию, которая анализирует дату и использует ее как ключ для сортировки:

import re
import datetime

def parse_date_from_log_line(line):
t_pat = re.compile(r".*\[\s?(\d+/\D+?/.*?)\]")
date_string = t_pat.search(line).group(1)
format = '%d/%b/%Y %H:%M:%S.%f'
return datetime.datetime.strptime(date_string, format)

log_path = 'mylog.txt'
with open(log_path) as log_file:
lines = log_file.readlines()
lines.sort(key=parse_date_from_log_line)

Оцените статью
TechArks.Ru
Добавить комментарий