apache-loggen + fluentd + elasticsearch + kibana = ログ検索デモ

Posted by johtani on Monday, June 10, 2013

目次

もう何番煎じだ?ってくらい書かれてますが、コリもせず書いてみました。 Elasticsearch+Kibanaの環境を作って、タムタムさんのログ生成ツールからApacheのダミーログを流しこんで入れてみました。

参考URL

インストールと起動

今回はCentOSへのインストールです。 基本的にはmemorycraftさんのブログの流れのままです。

elasticserchのインストールと起動

ダウンロードして、起動するだけ。 お試しということで、-fオプションにてコンソールにログ出力。

curl -OL https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.1.tar.gz
tar zxvf elasticsearch-0.90.1.tar.gz
cd elasticsearch-0.90.1
./bin/elasticsearch -f

Kibanaのインストールと起動

git cloneしてbundleインストール

git clone --branch=kibana-ruby https://github.com/rashidkpc/Kibana.git
cd Kibana
bundle install
ruby kibana.rb

これで、Kibana+ESのインストール+起動が完了。 下地が完了。

td-agentのインストールと起動

ログの流し込みはlogstashなのですが、fluentdのelasticsearchプラグインにて流しこむこともできます。 td.repoとしてtd-agentのリポジトリを登録してから以下を実行します。

yum install td-agent -y
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
vim /etc/td-agent/td-agent.conf
/etc/init.d/td-agent start

これで、td-agentがインストール出来ました。 次は設定です。

<source>
  type tail
  format apache
  path /var/log/httpd/dummy_access_log
  tag dummy.apache.access
</source>

<match *.apache.*>
  index_name adminpack
  type_name apache
  type elasticsearch
  include_tag_key true
  tag_key @log_name
  host localhost
  port 9200
  logstash_format true
  flush_interval 10s
</match>

以上が設定です。td-agentはtd-agentというユーザで起動されるので、/var/log/httpdディレクトリにアクセスできるかだけ確認が必要です。
いくつかの設定値について気になったので調べました。

  • index_name:adminpackとなってるが、elasticsearchではlogstash-xxxとなってる。
    • これは、logstash_formatがtrueの場合は、利用されないので、指定しなくてもいい。
  • type_name:Elasticsearchのタイプ名 * これはlogstash_formatを指定しても有効。ただし、Kibana側で画面からのtype指定は不可能。KibanaConfig.rbにて指定することは可能。
  • logstash_format:Kibana用にlogstashフォーマットで出力するオプション
    • この指定があるときは、index名が「logstash-YYYY.mm.dd」となる
    • record(ログ)に@timestampとして時刻が追加される。
  • tag_key:include_tag_keyがtrueと指定されているため、record(ログ)にtag_keyで指定した文字列をキー、値としてtagの値(上記例だとdummy.apache.access)が付与されて登録される。

apache-loggenのインストールと起動

タムタムさんが作成されたApacheのログのダミーを生成するツールです。
gem化されてるので、インストールは非常に簡単です。

gem install apache-loggen

で、ログを出力します。出力先は先程設定したdummy_access_logです。

apache-loggen --rate=10 --progress /var/log/httpd/dummy_access_log

秒間10アクセスログを出力してくれます。 これで、Kibanaでログが見れるようになりました。 なんて簡単なんでしょう。。。 簡単なログの検索ができてしまいました。 他の形式のログがどうなるのかとかは、また時間があれば。。。

感想とか

非常に簡単でした。素敵です。いくつかこうなるのかな?というのを試してみたのでメモを。

いくつか疑問点です。

  • 溜まったログの削除は手動?
    • おそらく。日付ごとにindexが出来上がっているので、削除は楽そう。「logstash-年月日」なので。
  • 認証とかかけれるの?
    • ログ検索は内部でするだろうから、まぁ、なくていいのかな。ログインすらないし。
  • 複数行のログとかってどーすんだろう?(JavaのExceptionとかが混ざるやつ)

本格的に触るようになれば調べるかなぁ。。。

あと、ログが増えてきた時にどういった分割構成ができるだろう?って思って考えてみたのが以下になります。

構成パターン

ログを複数扱う場合は次のようなパターンがありそうかと。

タグ(fluentdのタグ)で識別

「@log_name」という名前=fluentdのタグにてログを識別することで、異なるログを検索することができそうです。 タグであれば、プラグインによってはログ出力時に制御も可能だと思うので、td-agentの設定を変更したりすることもなく対応が可能かと。 ただ、ログの種別ごとにKibanaのプロセスを別にして起動したいといった用途には向いてなさそうです。

type_nameによる識別

ElasticSearchの機能であるtypeを利用したログの識別パターンです。
fluent-plugin-elasticsearchの設定でtype_nameを指定しました。 ここを別の名前にすることで、識別することも可能です。

ただし、この場合はKibanaの画面から指定して検索することができません。 →コメント頂きました。検索条件に「_type:タイプ名」と検索することでtypeを利用した検索が可能です。
タグ(@log_name)でも識別できるようにするなどの工夫が必要です。 その代わり、タグ識別ではできなかったKibanaのプロセスを別にして起動することは可能になります。
KibanaConfig.rbのTypeに値を設定することで、起動したKibanaが対象とするログを絞り込むことが可能です。 こうすることで例えば、apache用のKibanaとtomcat用のKibanaは別プロセスにして、ElasticSearchのクラスタは1つという構成も可能になります。

ElasticSearchサーバを別立て

ElasticSearchサーバをそもそも別のプロセスor別のサーバで起動し、Kibanaも別々にすればログの識別も可能です。 可能ですが、色々と管理するものが増えてめんどくさそうですね。。。

インデックス名変更

最後は、fluent-plugin-elasticsearchの設定で「logstash_format」をfalseにすれば、好きなindex_nameを付与できるので、 ログ種別ごとに名前を変更することで識別できます。
ただ、logstash形式でないインデックス名の場合、日付ローテーションができなかったり、Kibana内部で検索時に日付で検索対象を絞り込んで検索することで高速化するといった処理など、使えない機能が多々出てきてしまうのであまりおすすめじゃないかと。。。

ということで、流行りものは触っておこうということで、さわってブログ書いてみました。
開発中に立てておいて、各サーバのログを流しこんでおくなどにも利用できるかもしれないです。 アラート通知などの機能が出てくるともっと便利かもしれないです。


comments powered by Disqus

See Also by Hugo


Related by prelims-cli