Мы экспериментируем с Drools для обработки большого количества текстовых данных из файлов журнала.Я пытаюсь понять, как правильно измерить время события.
Рассматриваемое событие начинается в одной строке журнала, но может закончиться либо успешным завершением, либо необычным прерыванием.Вот что у меня проблемы с захватом.Вот как могут выглядеть записи журнала (когда другие строки журнала отфильтрованы):
Jan 24 06:50:29 app[623]: CallOriginateCmd
Jan 24 07:19:27 app[616]: Client ended the call
Jan 24 09:00:18 app[623]: CallOriginateCmd
Jan 24 09:34:48 app[616]: Client ended the call
Jan 24 11:03:56 app[623]: CallOriginateCmd
Jan 24 12:56:58 app[616]: Client ended the call
Jan 24 15:48:11 app[623]: CallOriginateCmd
Jan 24 16:13:24 app[616]: Client ended the call
Jan 24 17:16:16 app[623]: CallOriginateCmd
Jan 24 18:48:51 app[616]: Client ended the call
Jan 25 06:09:01 app[623]: CallOriginateCmd
Jan 25 06:09:24 app[623]: Failure: timeout sending Config
Jan 25 06:09:26 app[623]: CallOriginateCmd
Jan 25 06:09:50 app[623]: Failure: timeout sending Config
Я пытаюсь создать правила, которые связывают вызов 24 января 06:50:29 с 07:19.: Завершение 27, вызов 25 января 06:09:01 с ошибкой 06:09:24 и т. Д. Мои правила ниже не создают объект Call () с нужным мне временем начала / конца.
Вот схема моего кода:
rule "Found Call Start"
when
LogEntry( message matches ".*CallOriginateCmd.*", logTimestamp : timestamp )
then
Call call = new Call();
call.setStarttime( logTimestamp );
call.setPartial ( true );
insert( call );
AnalysisLog.debug( logTimestamp, "Call Started" );
end
rule "Found Call End"
when
LogEntry( message matches ".*Client ended the call.*", logTimestamp : timestamp )
call : Call( partial == true )
then
call.setEndtime( logTimestamp );
call.setPartial( false );
call.setFailure( false );
update( call );
AnalysisLog.debug( logTimestamp, "Call Ended." );
end
rule "Found Call Failure"
when
LogEntry( message matches ".*timeout sending Config.*", logTimestamp : timestamp )
call : Call( partial == true )
then
call.setEndtime( logTimestamp );
call.setPartial( false );
call.setFailure( true );
update( call );
AnalysisLog.debug( logTimestamp, "Call Failed." );
end
Вывод сверху:
Jan 17 22:53:04: Call Started
Jan 18 02:10:23: Call Failed.
Jan 17 23:09:23: Call Started
Jan 18 02:10:23: Call Failed.
Jan 17 23:25:39: Call Started
Кажется, что каждый вызов соответствует Failed, хотя только последний вызов в журнале должен
Я думал, что код:
call : Call( partial == true )
в предложении «когда» будет связывать начало + конец или начало + прерывание вместе, но это, очевидно, не делает этого.
Вместо этого, я полагаю, мне нужно найти способ в предложении «когда» найти вызов, где logTimestamp ближе всего к времени начала вызова.Возможно ли это?
TIA