フィールドの特定部分の文字列毎にログ件数をグラフ化する方法

Elasticsearchに以下のようなsyslogのデータを取り込んでいます。
"message"フィールドの中のname=xxxxx毎のsyslog件数の推移を示す線グラフを作成したいと考えています。
name=xxxxxには、以下のname=HTTP:DOS:ASTERISK-UPGRD-2以外にも様々な名称のsyslogが出力されています。

このように、フィールドの特定部分の文字列毎のログの件数をグラフ化することは可能でしょうか?

host:
10.0.0.1
message:
RT_IDP: IDP_ATTACK_LOG_EVENT: IDP: at 1559800784, SIG Attack log <1.1.1.1/57655->2.2.2.2/80> for TCP protocol and service SERVICE_IDP application HTTP by rule 3 of rulebase IPS in policy Recommended-copy. attack: id=22097, repeat=0, action=DROP, threat-severity=HIGH, name=HTTP:DOS:ASTERISK-UPGRD-2, NAT <0.0.0.0:0->0.0.0.0:0>, time-elapsed=0, inbytes=0, outbytes=0, inpackets=0, outpackets=0, intf:Untrust:reth2.0->Trust:reth3.0, packet-log-id: 0, alert=no, username=N/A, roles=N/A and misc-message -
priority:
info
facility:
local7
@timestamp:
June 1th 2019, 15:00:00.000
_id:
KZBfK2sBMkAc1ir2TBlh
_type:
fluentd
_index:
logstash-2019.06.01
_score:
-

こんにちわ。

messageの中にある文字列を少し加工して取り込むようにすれば、簡単に実現可能かと思います。

logstashをお使いのようですので、filterでgrokを使って、name=**** の部分を抽出するようにして、
その部分を別フィールドに入れます。

そして、そのフィールドの値を検索条件、絞り込み条件にすればできるかと思います。

nameのところだけ抜き出す簡単な例です

input {
    stdin {}
}

filter {
    grok {
        match => { "message" => "name=%{DATA:forum0610.log.name},"}
    }
}

output {
    stdout {
        codec => rubydebug
    }
}

tsgkdtさん

回答ありがとうございます。

現在の環境では、様々な機種のsyslogをElasticsearchに取り込んでいるため、
機種毎にフォーマットを変えずに汎用的なフォーマットを使っていました。

ご提案頂いたようにmessageフィールドの文字列を、さらに幾つかのフィールドに分割すればできそうですね。

logstashではなく、fluentdを利用しているのですが、その場合もプラグインなどを利用して同じような処理が
できるのでしょうか?

fluentdは詳しくないのでわかりませんが、きっとできるはずです。

仮にfluentdで処理しない場合でも、ElasticsearchにあるIngest nodeの機能を使うことによって、文字列を処理することができます。

今回の場合、grok processorが使えると思います。
https://www.elastic.co/guide/en/elasticsearch/reference/master/grok-processor.html

ご参考になれば幸いです。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.