2016-09-06 5 views
0

有する不規則なログ私はいくつかの通信機器から到来する(「メッセージ」の形で)イベントのトレース/ログを持っています。私の最終目標は、リアルタイムで(近くに)機器から来るデータストリームの監視と分析を行うことです。ELK - 複数のフォーマットと複数回線イベント

トレースはデバイスの内部操作のダンプのようなもので、複数のタイプのイベントが含まれています。複数の「メッセージ」にまたがるものもあります - 今はファイルを解析していますがstdinや何らかのストリームを解析します。

私は300万メッセージ時間を取得し、監視するために、いくつかのようなデバイスを持っていることを期待しています。私は現在、ちょうど:-)ものの始めた2つの課題(直面

マルチメッセージイベント

一部のイベントには、いくつかのメッセージの上に表示されます。

  • 関連のメッセージは必ずしも連続していません。
  • 通常、最初のメッセージは、イベントがセグメント化されていること、予想されるセグメント数、イベント識別子(キー)を含むことを示します。
  • セグメントの残りの部分は同じイベント識別子
  • は、分割ヘッダ及び他のセグメントは、
  • 自分のプリアンブル/タイプ識別子を有しているセグメント化されたメッセージは、ちょうど真ん中に「カット」と、次のメッセージに続けています。例えば、"<key xyz part 1> ... 12345"、イベントのいくつかの種類があります( "不規則な" コンテンツを持つ) "<key xyz part 2> 67890 ..."

複数のイベントタイプ

  • が続く(20〜50 PROBが。)

  • 各イベントの内容が異なります。

  • イベントのテキストは、任意の「固定」のパターンに従っていないようです。それはフリーテキストのキーと値のペア( "="セパレータとキーと値のペアと ":"セパレータ)を含んでいるようです。ここで助けてくれるのは、「フィールド」(それを呼び出すことができる場合)が「;」で区切られることが最も多いということだけです。

  • 一部のフィールドは偶数値を持っていません。

  • (私は100%わからないけど)(フィールドの点で)ペイロードも同じメッセージタイプの中に変更することができそうです。

いくつかの例(私が "難読化")

[2016年8月11日11:47:44.340] [011400 \ 00] 1/RncLmUePT(1/someResource [209]) ../filename.cpp:335 INFO:some_signal_name信号が、SomeEventNameというカプセル名で受信されました。これは、TYPE_OF_EXEPTIONがAnotherPlaceに集められたことを示します。

これらの5つのメッセージは、マルチメッセージイベントの例です。最後のメッセージ(それは少し異なる開始)と、その3番目と4番目のメッセージが切断されている「ミッド文」の不規則性を注意してください

[2016年8月11日11:47:44.340] [021100 \ 01] 2/PdcLmPrPT somefile.cc:172 INFO:000001216649856キーは、4つの部分が続くため<セグメント化トレース>

[2016年8月11日11:47:44.340] [021100 \ 01] 2/PdcLmPrPT somefile.cc:179 CLIENT_CODE = UNDEF; CLIENT_CODE2 = 1424514436 [0x54e85d84]; devId = 33456; devFroId(デバイスID = 33456); INFO:「ExceptionCode = 521; TIMER somenameの期限切れ; InterfaceTimout(内部); Ueh; SomeCrypticName;接続に影響しない; callProc = = 871; prDevId = UNDEF; prDevFroId = UNDEF; spId = tc:p:225:1; typeModId = 20; "

[2016-08-11 11:47:44.340] [021100 \ 01] 2/PdcLmPrPT somefile.cc:179 INFO: "S-RNFF = 377540;原因コード= UNDEF;何も受け取られませんでした; sourceType = devNoValid; sPJK = 000000000000000000000000; targetType = someConnType; sPJK = 000000000000000000000000; UEキャップ= Rel9-00000000000000000000000000000010; fileNameに= ../anotherFileName.cpp;line = 9031;前の状態= someStateName;現在の状態=」

[2016年8月11日11:47:44.340] [ 021100 \ 01] 2/PdcLmPrPT somefile.cc:179 "WaitSomeOtherState; noOfSomeConnectionState = 459; noOfSomeResUsage = 598; ActiveDevId = [6548、-1、-1、-1、-1]; ActiveDevFroId = [871、-1 、-1、-1、-1]; raTimerStatus = 0; raLaxTimerStatus = 0; procedureTriggerReason = someTypeOfRequest; lastGrabRule = NameOfGrabRule、付加テキスト= EstablishmentCau」

[2016年8月11日11:47:44.340] [ 021100 \ 01] 2/PdcLmPrPT(2/SOME_EXCEPTION)../differentFile.cpp:4610 TRACE1: "seは登録(12)です。 PPT接続セットアップ完了またはPOMPリンク復元表示は受信されませんでした。 「

は私が可視化(kibana)などのために弾性を検索するには、このデータを置くことを考えて、私はlogstashが仕事のためのツールであるかどうかを確認します(または、少なくとも、既存のコーデック/プラグイン/フィルター)ないです。私は他の/より良いフレームワークについても聞いています。

これまで読んだことのあるものから、もっと一般的なデータでは、私はマルチラインコーデックと簡単な弾性出力プラグインはありますが、ここではこれらのツールが実行可能なオプションであるとは思われません。(私の評価で正しいですか?)

私が考えたのは多分一部のlogstashプラグインを自分でコーディングするか、スタンドアロンプ​​ログラムでトレースを処理してください。

私は既存のツールをどのように使用することができますか、またはこのシナリオの良いアプローチは何ですか?

P.S.私はRubyの経験はありませんが、java/js/pythonと.NET(C#)にはとても流暢です。

P.S.2 ELKで100%ロックされていません。それはそのような仕事のための最も一般的なツールの1つと思われます。私は、TSDBや列/ドキュメントDBもオプションとして考えています。

答えて

0

マルチラインメッセージは連続していないので、メッセージを一緒にステッチングする方法を示すステートフルパーサーを作成する必要があります。それが連続的だった場合は、おそらくlogstash grokパターンを使用して、各メッセージの先頭と末尾を調べることができます。

代わりに、grokパターンを使用してメッセージIDを抽出し、それを属性としてログメッセージに追加する方法もあります。その後、Elasticsearchで別々のメッセージが表示されます。ただし、あなたのKibanaダッシュボードでは、検索をメッセージIDに簡単に制限して、メッセージIDに関連するすべてのイベントを取得することができます。これはあなたの目的には十分かもしれません。

+0

、(それらが連続していると仮定して)注文の問題を緩和するであろう、マルチフィルタはそれを扱うことができますか? –

+0

もしあなたが正規表現を思いつくことができるなら、それはlogstashでできるはずです –

0

grep/sed/awkの組み合わせを実行して入力ファイルから必要なデータを取得し、そのデータをイベントとして保持するルビーフィルタを作成できます。ここでの欠点は、操作を実行するためにファイルをメモリに保持する必要があることです。上記の設定で

フィルタ {

ruby { 
code => 'require "open3" 
     file_path = event.get("file_path") 
     cmd = "my_filter.sh -f #{file_path}" 
     stdin, stdout, stderr = Open3.popen3(cmd) 
     event.set("process_result", stdout.read) 
     err = stderr.read 
     if err.to_s.empty? 
      filter_matched(event) 
     else 
      event.set("ext_script_err_msg", err) 
     end' 
    remove_field => ["file_path"] 

}}