ELK (Elasticsearch + Logstash + Kibana)

splunk のデモをみて、自分の環境に logstash を入れてみた。 :)

logstash - open source log management

どうせやるなら、Centralized Setup with Event Parsing で構成してみた。

このページの構成図のようにしたが、Web インターフェースは Kibana のほうがいい感じ。

logstash-shipper -> redis -> logstash-indexer -> Elasticsearch -> Kibana


(この節は kibana 2 用の古い内容です)

Kibana で細かなアクセス権限を与える場合は、フロントに apache + mod_proxy で実装する。
ProxyPass              /kibana/  http://127.0.0.1:5601/
ProxyPassReverse       /kibana/  http://127.0.0.1:5601/
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
+いつもの ACL で

Kibana 3 系は elasticsearch を proxy する。あとは kibana 3 の config.js をごにょごにょ

ProxyRequests Off
ProxyPass              /es/  http://127.0.0.1:9200/ disablereuse=On ttl=120 timeout=3000
ProxyPassReverse       /es/  http://127.0.0.1:9200/ timeout=3000
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
+いつもの ACL で

Kibana4 系は apache reverse proxy ではうまく動かないので、様子見中

どうも apache の Basic 認証をうまく越えられないようだ。Basic 認証外すと動く。network + Basic 認証にしておかないと怖いなぁ
https://github.com/elastic/kibana/issues/3302
このパッチと下記の設定でなんとかいけそげ (4.0.2 で URL に USER:PASS@HOST が正しく動く様になった。が、まだおかしい)(firefox ダメダメだし)
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass              /kibana/  http://127.0.0.1:5601/ disablereuse=On ttl=120 timeout=3000
    ProxyPassReverse       /kibana/  http://127.0.0.1:5601/ timeout=3000
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1
    SetEnv proxy-initial-not-pooled 1

    <Location /kibana>
      Order Allow,Deny
      Allow from 127.0.0.1 *ALLOW-NETWORKS*
      <IfModule mod_authn_file.c>
        AuthUserFile /path/htpasswd
	AuthType Basic
      </IfModule>
      require valid-user
    </Location>

    <Location /kibana/elasticsearch>
      Order Allow,Deny
      Allow from 127.0.0.1
      Satisfy any
    </Location>


java の shipper は重たい。 専用の shipper があるっぽい。 (私は、今は logstash-forwarder を使ってます)

ログのパースは解析用サーバの shipper でやってる構成に今はしている
My logstash config, grok filter, grok patterns @ github
sshd や postfix の grok pattern あります。今は collectd のメトリックスを収集するテスト中。


indexer と shipper の java プロセスは別に起動したほうがパフォーマンスが良い。

lightweight shipper

redis にいれる lightweight shipper

beaver : python daemon that munches on logs and sends their contents to logstash

udp で直接ぶち込むには

-F string -t udp

lumberjack というのも良いらしい。

lumberjack
lumberjack は名前がかわって logstash-forwarder になった。elasticsearch 軍団に入った。
logstash-forwarder
elasticsearch の repository に logstash-forwarder の deb がひっそりあるのだが、 i386 版がなくってアセった....

parser

各種ログのパターンのメモ

apache error log 系

Logstash parser for ModSecurity/CRS entries in the Apache ErrorLog

postfix 系

Postfix LogStash patterns
Postfix grok filters

logstash の書籍がでた。うれしい

The LogStash Book

Elasticsearch のメンテナンス

elasticsearch-curator

ERROR

何故か接続が切れる...

Registrar received 100 events
Registrar received 100 events
Registrar received 100 events
Read error looking for ack: read tcp _SHIPPER_IP_:_SHIPPER_PORT_: i/o timeout
Setting trusted CA from file: /etc/logstash/logstash-forwarder.crt
Connecting to [_SHIPPER_IP_]:_SHIPPER_PORT_ (_SHIPPER_IP_)
Connected to _SHIPPER_IP_
Registrar received 100 events
Read error looking for ack: read tcp _SHIPPER_IP_:_SHIPPER_PORT_: i/o timeout
Setting trusted CA from file: /etc/logstash/logstash-forwarder.crt
Connecting to [_SHIPPER_IP_]:_SHIPPER_PORT_ (_SHIPPER_IP_)
Connected to _SHIPPER_IP_
Registrar received 100 events
Read error looking for ack: read tcp _SHIPPER_IP_:_SHIPPER_PORT_: i/o timeout
Setting trusted CA from file: /etc/logstash/logstash-forwarder.crt
Connecting to [_SHIPPER_IP_]:_SHIPPER_PORT_ (_SHIPPER_IP_)
Connected to _SHIPPER_IP_
Registrar received 100 events
spool-size=10 でしのぐ...
これか? https://github.com/elasticsearch/logstash-forwarder/issues/323


munin

logstash をモニタリングする munin plugin (なんか微妙なのですが munin ファンなので私)

https://raymii.org/s/software/Munin_plugin_Logstash_Kibana_messages_per_hour.html
elasticsearch の日付は UTC なので、マシンの時刻が JST な場合は、スクリプト内に date を date -u にしておく。

日付またぎ問題を大胆に処理してみた。

TOTAL_EVENTS=$(curl -s -k -XGET http://127.0.0.1:9200/logstash-`/bin/date -u --date "1 day ago" +%Y.%m.%d`,logstash-`/bin/date -u +%Y.%m.%d`/_search -d '{ "size": 0, "query": { "filtered": { "query": { "match_all": { } }, "filter": { "range": { "@timestamp": { "from": "'`/bin/date -u --date "1 hours ago" +%Y-%m-%dT%H:00:00`'", "to": "'`/bin/date -u +%Y-%m-%dT%H:00:00`'" } } } } }, "from": 0, "sort": { "@timestamp": { "order": "desc" } }}' | /bin/grep --only \"hits\"\:\{\"total\"\:[0-9]*,\" | /bin/grep -o [0-9]*)