次のような部分を含むログファイルを扱っています。
538,486K of 1,048,576K
これらは、人間が読める形式でレンダリングされたメモリ使用量(Javaヒープスペース)を表します。 Kibanaのチャートでそれらの数値を追跡したいと思います。これを行うには、Logstashのgrokフィルターを使用してこれらの数値を解析したいのですが、千単位の区切り文字を処理する(つまり無視する)方法がわかりません。
理想的には、「K」を処理して1000を掛けることができるものがあればいいのですが。現時点では、システムがキロバイト以外の単位でログインしていることに気づいていませんが、そのような仮定はしたくありません。
mutate
フィルターを使用すると、テキストを gsub
オプションに置き換えることができます。
gsub
は配列を取ります。ここで、値のトリプレットはすべて次のことを示します。
技術的には正規表現をサポートしていますが、この場合は必要ありません。
まず、コンマを削除します。十分に単純です。
次に、乗算します。 K
に1000を掛ける必要がありますか?もしそうなら、私たちは単にK
を000
に置き換えることができるように思えます。
それらをまとめる:
filter {
mutate {
gsub {[
"some_field", ",", "",
"some_field", "K", "000"
]}
}
}
必要に応じて、他の置換オプションを追加できます。
状況によっては、K
に1024が掛けられる場合がありますが、これは少し複雑になります。箱から出してすぐに解決策は見つかりませんが、 Ruby
フィルターを使用して算術演算を実行できます。
私の場合、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
"
}
}
}
}
もっと簡潔にできると思いますが、うまくいくようです。