2012-01-28 3 views
1

우리는 로그 파일에서 많은 양의 텍스트 데이터를 처리하기 위해 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 6시 50분 29초 호출 7시 19분 27초과 1 월을 연결하는 규칙을 만들려고 해요 종료, 1 월 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 

모든 호출은 로그의 마지막 호출이 일치해야하지만, 실패 일치하는 것으로 보인다

여기 내 코드의 개요입니다. 내

call : Call(partial == true) 

절이 시작 + 끝을 연결하거나 함께 중지 + 시작하지만 것 "때"이 분명히이 작업을 수행하지 않습니다

는 그 코드를 생각했다.

대신 "when"절에서 logTimestamp가 호출 시작 시간과 가장 가까운 호출을 찾는 방법을 찾아야한다고 가정합니다. 이것이 가능한가? TIA

답변

1

로그에 상관 관계 필드가 표시되지 않으므로 메시지가 항상 순차적이라고 가정합니다. 즉, 메시지가 호출을 시작하고 다음 메시지가 호출을 완료하거나 실패합니다. 이 경우 여러 가지 방법이 있지만 다음과 같이 시도 할 수 있습니다.

rule "Found Call End" 
    when 
     $s : LogEntry(message matches ".*CallOriginateCmd.*") 
     $e : LogEntry(message matches ".*Client ended the call.*") 
     not LogEntry(timestamp > $s.timestamp && timestamp < $e.timestamp) 
    then 
     Call call = new Call(); 
     call.setStarttime($s.getTimestamp()); 
     call.setEndtime($e.getTimestamp()); 
     call.setFailure(false); 
     retract($s); 
     retract($e); 
     insert(call); 
     AnalysisLog.debug(logTimestamp, "Call Ended."); 
end 

호출 실패 시나리오에 대해 유사한 규칙을 작성하십시오. 로그에 상관 필드가있는 경우 정확한 LogEntries를 상관시키기위한 제약 조건을 추가하기 만하면됩니다.

+0

감사합니다. LogEntry를 when 절에 모두 추가 할 생각은 없었습니다. –

0

은 Drools가 퓨전, 당신은 당신이 시작 호출 이벤트가 통화 종료 이벤트 전에 발생하는지 확인 시간 연산자를 사용할 수 있도록 이벤트로 LogEntry를 처리 할 수있을 것입니다 확인했다. Drools fusion은 자동 이벤트 라이프 사이클 관리를 제공합니다. 나는 아직도 기술적 인 문제를 넘어서서 당신의 주된 목적이 무엇인지 이해하려고 노력하고 있습니다. 건배

+0

자세한 설명을 포함하도록 설명이 업데이트되었습니다. 지금은 더 명확한가요? –

관련 문제