初めて投稿します。
《環境》
- Elasticsearch, Logstash, Kibana, Beats(Filebeat)のバージョン:5.0.2
- ELKスタックをサーバA(CentOS6.2)、FilebeatをサーバB(CentOS6.7)にインストール
《状況》
サーバA上のWebのメールフォームからメールを送信し、その際にto,from,cc等の情報をテキストにログ(独自フォーマット)として吐き出します。 このログをFilebeatからサーバBのLogstashに投げて加工し、Elasticsearchに蓄積させている状態です。《やりたいこと》
このメールフォームではccを0~3つまで設定して送信できるようになっているのですが、このccをそれぞれElasticsearchにフィールドに登録させたいと考えています(Kibanaでどの宛先が多いのか、などの情報を見たいため)。 この動作をさせるためには、Logstashのgrok、matchの条件をどのように記述すれば良いのでしょうか?(あるいは、他の方法があるか) 現状では下記のように条件を記述しています。grok { match => { "message" => [ "%{TIMESTAMP_ISO8601:timestamp}, TO=\<%{NOTSPACE:to}\>, FROM=\<%{NOTSPACE:from}\>, CC=\<\>, SUBJECT:%{GREEDYDATA:subject}", "%{TIMESTAMP_ISO8601:timestamp}, TO=\<%{NOTSPACE:to}\>, FROM=\<%{NOTSPACE:from}\>, CC=\<%{NOTSPACE:cc}\>, SUBJECT:%{GREEDYDATA:subject}", "%{TIMESTAMP_ISO8601:timestamp}, TO=\<%{NOTSPACE:to}\>, FROM=\<%{NOTSPACE:from}\>, CC=\<%{NOTSPACE:cc}\>, CC2=\<%{NOTSPACE:cc2}\>, SUBJECT:%{GREEDYDATA:subject}" ] } }しかし、このパターンですとccの中にcc2などの情報も一緒に入ってきてしまいます(例えば、 CC=<hoge@example.com>, CC2=<fuga@example.com> という行だと、 cc:hoge@example.com, cc2:fuga@example.com という形で入ってきてほしいのですが、cc:hoge@example.com>, CC2=<fuga@example.com> という一続きの文字列で入ってしまう)。 logstash/grok-patterns at v1.4.2 · elastic/logstash · GitHubのパターンを参照すると、少なくともNOTSPACEはスペースで区切られそうな気がするのですが…。 メールアドレスを厳密に正規表現で扱おうとするのはかなり無理があるという話は聞いたことがあるので、厳密にはやろうとは考えていないのですが、このような状況ではどのようにパターンを記述すれば良いのか、ご教授頂けると助かります。
以上、よろしくお願いします。