Posted at

Apacheのアクセスログを、FluentdでtailしてElasticsearchに放り込む


やりたいこと


  • Apacheのアクセスログを、可視化・分析するための環境を作りたい

ということをお題に、


  • ApacheのアクセスログをFluentdでtailして

  • Elasticsearchに放り込み、Kibanaで参照可能な状態にする

というところまでをやってみます。


環境

Ubuntu Linux 18.04 LTSで行っています。

$ cat /etc/os-release 

NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

なお、サーバーについては


  • ApacheおよびFluentd … 172.17.0.2

  • ElasticsearchおよびKibana … 172.17.0.3

で稼働させるものとします。


Apacheのインストール

なにはともあれ、まずはApacheのインストール、それから起動。

$ sudo apt install apache2

$ sudo service apache2 start

インストールされたApacheのバージョン。

$ /usr/sbin/apache2 -v       

Server version: Apache/2.4.29 (Ubuntu)
Server built: 2018-10-10T18:59:25

表示するコンテンツがないので、とりあえずApacheのドキュメントを放り込んでみます。

$ cd /var/www/html

$ sudo -E wget https://archive.apache.org/dist/httpd/docs/httpd-docs-2.4.33.ja.zip
$ sudo unzip httpd-docs-2.4.33.ja.zip
$ sudo mv httpd-docs-2.4.33.ja/* ./.

選択しているApacheのバージョンは、aptでインストールしたものよりも、若干新しいですが…。

範囲を選択_001.png

tail対象にする、アクセスログの確認。

$ sudo tail -f /var/log/apache2/access.log

172.17.0.1 - - [11/Dec/2018:11:52:14 +0000] "GET /getting-started.html HTTP/1.1" 200 4746 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:16 +0000] "GET /filter.html HTTP/1.1" 200 2425 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:51 +0000] "GET /misc/security_tips.html HTTP/1.1" 200 7814 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:53 +0000] "GET /server-wide.html HTTP/1.1" 200 3075 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:01 +0000] "GET /vhosts/index.html HTTP/1.1" 200 2839 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:02 +0000] "GET /vhosts/index.html HTTP/1.1" 200 2838 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:03 +0000] "GET /vhosts/fd-limits.html HTTP/1.1" 200 3281 "http://172.17.0.2/vhosts/index.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"


Fluentdのインストール

続いて、Fluentdをインストールします。

こちらを参照して、実行。

Installing Fluentd Using deb Package

$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh

起動。

$ sudo service td-agent start

設定は後でやりましょう。


ElasticsearchとKibanaのインストール

続いて、ElasticsearchとKibanaをインストールして起動します。

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz

$ tar xf elasticsearch-6.5.2.tar.gz
$ cd elasticsearch-6.5.2
$ vim config/elasticsearch.yml # 設定変更
$ bin/elasticsearch

設定はほぼデフォルトですが、外部からのネットワークアクセスの許可と、Single Node設定にします。

config/elasticsearch.yml

network.host: 0.0.0.0

discovery.type: "single-node"

続いて、Kibanaのインストールと起動。

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.2-linux-x86_64.tar.gz

$ tar xf kibana-6.5.2-linux-x86_64.tar.gz
$ cd kibana-6.5.2-linux-x86_64
$ vim config/kibana.yml # 設定変更
$ bin/kibana

Kibanaについても、外部からアクセスできるように設定します。

config/kibana.yml

server.host: "0.0.0.0"


Fluentdの設定をする

では、Fluentdを設定していきましょう。

Apacheのアクセスログを、Elasticsearchに放り込むように構成します。

まず最初に、インストールしたApacheのデフォルトのログのパーミッションでは、Fluentdから読み込めないため権限変更…。

$ sudo chmod o+rx /var/log/apache2

$ sudo chmod o+r /var/log/apache2/*

では、Fluentdの設定を行います。ほぼドキュメント通りですが、tail Input PluginとElasticsearch Output Pluginを設定します。

/etc/td-agent/td-agent.conf

<source>

@type tail
path /var/log/apache2/access.log
pos_file /var/log/td-agent/apache2-access.log.pos
tag apache2.access
format apache2
</source>

<match apache2.access>
@type elasticsearch
host 172.17.0.3
port 9200
logstash_format true
</match>

Apacheのアクセスログの読み込みの設定はこちらで、ファイル/var/log/apache2/access.logをtailし、読み込んだポジションを/var/log/td-agent/apache2-access.log.posに保存、ファイルフォーマットはapache2で設定します。

<source>

@type tail
path /var/log/apache2/access.log
pos_file /var/log/td-agent/apache2-access.log.pos
tag apache2.access
format apache2
</source>

Apacheのアクセスログに関しては、パースがプラグインとして提供されていて良いですね。

apache2 Parser Plugin

読み込んだ内容は、「apache2.access」タグを付与します。

そして、タグ「apache2.access」にマッチしたら、Elasticsearchに放り込むようにOutput Pluginを設定します。

<match apache2.access>

@type elasticsearch
host 172.17.0.3
port 9200
logstash_format true
</match>

Elasticsearch Output Plugin

接続先とポートは見たままですが、logstash_formatというのは取り込む時のElasticsearchのインデックス名をlogstash-%Y.%m.%dにするかどうかですね(trueの場合、logstash-%Y.%m.%dとなります)。

このように、Fluentdはデータの取り込みやパース、変換、出力をプラグインを使用して行います。

どのようなプラグインがあるかは、ドキュメントを参照しましょう。

ここまで設定したら、Fluentdを再起動します。

$ sudo service td-agent restart

Apacheで公開しているコンテンツにアクセスすると、

範囲を選択_005.png

ポジションファイルが更新されていきます。

/var/log/td-agent/apache2-access.log.pos 

/var/log/apache2/access.log 000000000000122b 000000000024981e

すると、Elasticsearchにデータが入るようになるので、KibanaでDiscoveryの設定を行います。データが入るように設定できていれば、アクセスログが出力されて少しすると、logstash-〜というインデックスが参照可能になっているはずです。

範囲を選択_002.png

あとは、これを登録して

範囲を選択_003.png

範囲を選択_004.png

参照できるようにすればOKです。

範囲を選択_006.png

ここから先は、Kibanaで好きなようにVisualizeしましょう。