Многострочный анализ журнала для времени обслуживания в PHP / Python - PullRequest
0 голосов
/ 19 ноября 2010

Каков наилучший способ анализа многострочного файла журнала, который требует знания контекста из предыдущих строк в php и / или python?

ex.

 Date    Time    ID    Call

1/1/10 00:00:00 1234 Start
1/1/10 00:00:01 1234 ServiceCall A Starts
1/1/10 00:00:05 1234 ServiceCall B Starts
1/1/10 00:00:06 1234 ServiceCall A Finishes
1/1/10 00:00:09 1234 ServiceCall B Finishes
1/1/10 00:00:10 1234 Stop

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

Конечная цель - выяснить, сколько времени занимает каждая транзакция и сколько времени занимает каждая суб-транзакция.

Я бы хотел использовать библиотеку, если она уже существует.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2010

Моей первой мыслью было бы создавать объекты каждый раз, когда мой анализатор встречал шаблон запуска с новым ключом.Я предполагаю, из вашего примера, что 1234 - это ключ, такой, что все строки журнала, которые должны быть связаны друг с другом, могут быть сопоставлены с состоянием одной «вещи» (объекта).

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

Из вашего примера эти объекты "состояния журнала"(из-за отсутствия более подходящего термина) может содержать список или словарь (или другой контейнер) для каждого ServiceCall (который, как я ожидаю, будет другим классом объектов).

Таким образом, общий дизайн был бы парсером / диспетчером, который читает журнал, если элемент журнала относится к какому-либо существующему объекту (ключу), то элемент отправляется объекту, который затем может создать свой собственный (ServiceCall)или другие) объекты и / или события отправки для этих объектов или создания исключений или вызова обратных вызовов или вызовов других функций по мере необходимости.

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

Полагаю, вы также захотите поддержать какой-либо метод сообщения о состоянии или состоянии, чтобы приложение могло перечислять все живые (не собранные) объекты в ответ на сигналы или команды в каком-либо другом канале (возможно, изнеблокирующая проверка, выполняемая анализатором / диспетчером)

0 голосов
/ 19 ноября 2010

Вот вариант синтаксического анализатора журналов, который я написал недавно, с учетом вашего формата журналов.(Общий подход очень близок к описанию Джима Денниса, хотя я использовал списки по умолчанию для накопления всех записей за любой данный сеанс.)

from pyparsing import Suppress,Word,nums,restOfLine
from datetime import datetime
from collections import defaultdict

def convertToDateTime(tokens):
    month,day,year,hh,mm,ss = tokens
    return datetime(year+2000, month, day, hh,mm,ss)

# define building blocks for parsing and processing log file entries
SLASH,COLON = map(Suppress,"/:")
integer = Word(nums).setParseAction(lambda t:int(t[0]))
date = integer + (SLASH + integer)*2
time = integer + (COLON + integer)*2
timestamp = date + time
timestamp.setParseAction(convertToDateTime)

# define format of a single line in the log file
logEntry = timestamp("timestamp") + integer("sessionid") + restOfLine("descr")

# summarize calls into single data structure
calls = defaultdict(list)
for logline in log:
    entry = logEntry.parseString(logline)
    calls[entry.sessionid].append(entry)

# first pass to find start/end time for each call
for sessionid in sorted(calls):
    calldata = calls[sessionid]
    print sessionid, calldata[-1].timestamp - calldata[0].timestamp

Для ваших данных это выводит:

1234 0:00:10

Можно обработать список записей каждого сеанса с помощью аналогичного подхода, чтобы отделить суб-транзакции.

0 голосов
/ 19 ноября 2010

Я могу придумать два разных способа сделать это.

1) Вы можете использовать конечный автомат для обработки файла строка за строкой. Когда вы нажмете Стартовую линию, отметьте время. Когда вы нажмете на Стоп-строку с тем же идентификатором, введите время и отчет.

2) Используйте PHP * регулярные выражения, совместимые с Perl с модификатором m, чтобы сопоставить весь текст из каждого набора стартовой / стоповой строк, затем просто посмотрите на первую и последнюю строки каждой возвращенной строки соответствия.

В обоих случаях я бы проверил совпадение идентификаторов, чтобы предотвратить сопоставление разных наборов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...