2012-01-28 3 views
1

Droolsを使用して、ログファイルから大量のテキストデータを処理しています。私はイベント時間を適切に測定する方法を理解しようとしています。droolsを使用すると、テキストログ内のイベントの継続時間が計算されます

イベントは1つのログ行で開始されますが、正常終了または異常終了によって終了することがあります。それが私がキャプチャに問題があるのです。ログエントリが(他のログの行が除外されている場合)どのように見えるかここです:

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 

私は七時19分27秒で1月24日午前6時50分29秒のコールをリンクするルールを作成しようとしています終了、Jan 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の融合を確認しました、あなたは、開始コールイベントは、通話終了イベントの前に発生したことを確認するために一時的な演算子を使用することができ、イベントとしてログ・エントリに対処することができるようになります。 Droolsの融合は、自動イベントライフサイクル管理を提供します。私はまだあなたの主な目的は、技術的な問題を超えて理解しようとしています。 乾杯。

+0

説明が更新され、より詳細な情報が追加されました。それは今はっきりしていますか? –