の際に扱っているLogstashですが、この時使用したファイルとは別のファイルを取り込もうとしてハマりました。
何が原因なのかログから見えにくい、ということもあり、こちらに記録を残しておきます。
「指定したファイルへのアクセス権」が足りなかった。。。
結論だけ言ってしまえば、それだけでした。。。
前回の例だと、
path => "/var/log/mysql_monitor/show_global_status.log"
となっているのですが、rootユーザで作業していた上に、完全にオリジナル(このために作った)なディレクトリ、パスなので問題が出なかったのですが、Apacheが標準的に出力するaccess_logを取り込もうとして失敗していました。
ApachehttpdをYumでLinuxにインストールした場合のデフォルトのログファイルパスを指定すると、以下のようになります。
path => "/var/log/httpd/access_log"
この時、access_logのファイル自体は
-rw-r--r-- 1 root root 815468 Sep 12 16:08 access_log
なのですが、このディレクトリは、
drwx------ 2 root root 4096 Sep 11 14:21 httpd
となっており、root以外では読むことすら出来ません。
で、
drwxr-xr-x 2 root root 4096 Sep 11 14:21 httpd
に変更すると、ディレクトリ配下に対してroot以外でも読み取りできるようになると。
ファイル自体の権限だけでなく、そのファイルがあるディレクトリの「実行権限:x」の状態がポイントですね。
Logstashの実行モードと権限
yumでインストールしたLogstashは、サービスとして起動(initctl start logstash)すると、実行ユーザーは「logstash」なので、/var/log/httpd/が見えず、その下のファイルを参照することができません。
サービスではなくフロントで起動(sudo /usr/share/logstash/bin/logstash -f 設定ファイル)すると、実行ユーザーは「root」なので、/var/log/httpd/access_logまできれいにアクセスできます。
なお、ログを見ると
Logstashログは、サービスで起動したときは、「/var/log/logstash/logstash-plain.log」にログが出力されますし、フロント起動した時は標準出力でコンソールに出力されます。
しかし、今回のハマリケースでは、どちらもエラーで落ちずに、以下までログが進んで、Logstashが普通に起動している状態まで進んでしまうので、何が起こっているかわかりにくいのです。
logstash.pipeline - Pipeline main started Successfully started Logstash API endpoint {:port=>9600}
で、いつまでたってもElasticsearch側にデータが取り込まれないなー、となって、問題が発生していることに気づく感じです。
Logstashからみれば、「起動したけど、取り込むべきファイルが見えない(まだ生成されてない?)から待ってるよ」ってことなのかもしれませんが。
まとめ
・yumでインストールしたLogstashのサービス起動時の実行ユーザーは「logstash」
・(Logstashをサービスで動かすときは特に)Inputのファイルおよびディレクトリへのアクセス権に注意する。
・「エラーなし、フロント起動だとElasticsearchへ取り込まれるのに、サービス起動だと取り込まれない」パターンは、インプットファイル/パスの権限を疑う。
Elaticsearch+Kibanaの新しい本、そろそろ発売ですね!
データ分析基盤構築入門[Fluentd、Elasticsearch、Kibanaによるログ収集と可視化]
- 作者:鈴木健太,吉田健太郎,大谷純,道井俊介
- 出版社/メーカー:技術評論社
- 発売日: 2017/09/21
- メディア:単行本(ソフトカバー)
- この商品を含むブログを見る