なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

Logstashでハマった - Kibanaを立ててみた:番外編

atsuizo.hatenadiary.jp

の際に扱っているLogstashですが、この時使用したファイルとは別のファイルを取り込もうとしてハマりました。

何が原因なのかログから見えにくい、ということもあり、こちらに記録を残しておきます。

「指定したファイルへのアクセス権」が足りなかった。。。

結論だけ言ってしまえば、それだけでした。。。


前回の例だと、

path => "/var/log/mysql_monitor/show_global_status.log"

となっているのですが、rootユーザで作業していた上に、完全にオリジナル(このために作った)なディレクトリ、パスなので問題が出なかったのですが、Apacheが標準的に出力するaccess_logを取り込もうとして失敗していました。


Apache httpdYumLinuxにインストールした場合のデフォルトのログファイルパスを指定すると、以下のようになります。

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によるログ収集と可視化]

データ分析基盤構築入門[Fluentd、Elasticsearch、Kibanaによるログ収集と可視化]