rsyslogから直接elasticsearchにログ蓄積する
サーバやネットワーク装置のログ蓄積と可視化について調査してまして、通常だとfluentdが有名ですが、rsyslogから直接elasticsearchに転送するモジュールがあったので導入してみました。
今回実装した環境は以下になります。(elasticsearchとkibanaは予め構築済み)
- CentOS7.3
- elasticsearch-5.4.3-1
- kibana-5.4.3-1
rsyslog-elasticsearchのインストール
@baseリポジトリにあるrsyslog-elasticsearchをインストールします。
# yum install rsyslog-elasticsearch 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ rsyslog-elasticsearch.x86_64 0:7.4.7-16.el7 を インストール --> 依存性解決を終了しました。 依存性を解決しました ======================================================================================= Package アーキテクチャー バージョン リポジトリー 容量 ======================================================================================= インストール中: rsyslog-elasticsearch x86_64 7.4.7-16.el7 base 41 k トランザクションの要約 ======================================================================================= インストール 1 パッケージ 総ダウンロード容量: 41 k インストール容量: 40 k Is this ok [y/d/N]: y Downloading packages: rsyslog-elasticsearch-7.4.7-16.el7.x86_64.rpm | 41 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : rsyslog-elasticsearch-7.4.7-16.el7.x86_64 1/1 検証中 : rsyslog-elasticsearch-7.4.7-16.el7.x86_64 1/1 インストール: rsyslog-elasticsearch.x86_64 0:7.4.7-16.el7 完了しました!
elasticsearch転送用のconfigを作成する
基本的には公式サイトに従って記述すればよいです。 ただ、そのままだと単一のインデックスで作成されるため、dynSearchIndexを有効化してsyslog-YYYY-MM-DDで日付ごとにインデックスを作成するように変更しています。
# vi /etc/rsyslog.d/elasticsearch.conf module(load="omelasticsearch") # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 #### TEMPLATES #### template(name="syslog" type="list" option.json="on") { constant(value="{") constant(value="\"timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"message\":\"") property(name="msg") constant(value="\",\"host\":\"") property(name="hostname") constant(value="\",\"severity\":\"") property(name="syslogseverity-text") constant(value="\",\"facility\":\"") property(name="syslogfacility-text") constant(value="\",\"syslogtag\":\"") property(name="syslogtag") constant(value="\"}") } $template syslog-index,"syslog-%timereported:1:10:date-rfc3339%" #### RULES #### *.* action(type="omelasticsearch" server="localhost" serverport="9200" template="syslog" dynSearchIndex="on" searchIndex="syslog-index" bulkmode="on" queue.type="linkedlist" queue.size="5000" queue.dequeuebatchsize="300" action.resumeretrycount="-1")
rsyslogをリスタートする
# systemctl restart rsyslog
elasticsearchでインデックスが作成されているか確認する
正常に動作していれば、自動的にインデックスが作成されています。
# curl localhost:9200/_cat/indices |sort % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 3901 100 3901 0 0 20649 0 --:--:-- --:--:-- --:--:-- 20640 yellow open .kibana lCPWOQLCRLi1LfLEWlUEUA 1 1 7 0 41.1kb 41.1kb yellow open syslog-2017-07-10 1eC8AkrdTla0bukomGdSKw 5 1 3451 0 1.1mb 1.1mb
データを検索して蓄積されていることが確認できます。
# curl -s -S -XGET 'http://localhost:9200/syslog-2017-07-10/events/_search?pretty=true' -d '{ "query" : { "term" : { "severity" : "info" } } }' | head -n 20 { "took" : 1, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 3386, "max_score" : 0.059038434, "hits" : [ { "_index" : "syslog-2017-07-10", "_type" : "events", "_id" : "AV0oKZqP8_xTAaCoS53M", "_score" : 0.059038434, "_source" : { "timestamp" : "2017-07-10T01:23:21.281591+09:00", "message" : " [origin software=\"rsyslogd\" swVersion=\"7.4.7\" x-pid=\"4143\" x-info=\"http://www.rsyslog.com\"] start",