web-dev-qa-db-ja.com

Logstashで人間が読めるバイト数を解析するにはどうすればよいですか?

次のような部分を含むログファイルを扱っています。

538,486K of 1,048,576K

これらは、人間が読める形式でレンダリングされたメモリ使用量(Javaヒープスペース)を表します。 Kibanaのチャートでそれらの数値を追跡したいと思います。これを行うには、Logstashのgrokフィルターを使用してこれらの数値を解析したいのですが、千単位の区切り文字を処理する(つまり無視する)方法がわかりません。

理想的には、「K」を処理して1000を掛けることができるものがあればいいのですが。現時点では、システムがキロバイト以外の単位でログインしていることに気づいていませんが、そのような仮定はしたくありません。

1
Peter Becker

mutate フィルターを使用すると、テキストを gsub オプションに置き換えることができます。

gsubは配列を取ります。ここで、値のトリプレットはすべて次のことを示します。

  • ターゲットフィールド名
  • 検索パターン
  • パターンを置き換える

技術的には正規表現をサポートしていますが、この場合は必要ありません。

まず、コンマを削除します。十分に単純です。

次に、乗算します。 Kに1000を掛ける必要がありますか?もしそうなら、私たちは単にK000に置き換えることができるように思えます。

それらをまとめる:

filter {
    mutate {
        gsub {[
            "some_field", ",", "",
            "some_field", "K", "000"
        ]}
    }
}

必要に応じて、他の置換オプションを追加できます。

状況によっては、Kに1024が掛けられる場合がありますが、これは少し複雑になります。箱から出してすぐに解決策は見つかりませんが、 Ruby フィルターを使用して算術演算を実行できます。

1
rutter

私の場合、rutterの答えはうまくいくはずだと思います。これが私がそれを読む前にやったことです:

filter {
  grep {
    match => { "message" => "...something identifying the message..." }
    drop => false
    add_tag => [ "MyMarker" ] 
  }
  if "MyMarker" in [tags] {
    grok {
      match => [ "message", "...(?<rawCurValue>[0-9,]+)K of (?<rawMaxValue>[0-9,]+)K..." ]
      break_on_match => false
    }
    if "_grokparsefailure" not in [tags] {
      Ruby {
        code => "
           if(event['rawCurValue'])
             event['curValue'] = Integer(event['rawCurValue'].gsub(',','')) * 1000
           end
           if(event['rawMaxValue'])
             event['maxValue'] = Integer(event['rawMaxValue'].gsub(',','')) * 1000
           end
        "
      }
    }
  }
}

もっと簡潔にできると思いますが、うまくいくようです。

1
Peter Becker