Apacheのアクセスログを、EmbulkでElasticsearchに叩き込む


やりたいこと

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

ということをお題に、

  • すでにファイルとして存在するログを、Elasticsearchに放り込んで
  • Kibanaで可視化するための準備を整える

ということをやってみたいと思います。

リアルタイムに出力されるログを対象にするのならFluendが通常だと思いますが、今回は「すでに存在するログ」を対象にするので、バルクローダーであるEmbulkを使ってみたいと思います。

対象のアクセスログ

ちょうど、Apacheのアクセスログが手元にありましてですね。そこそこの期間。

logrotatedで扱っていて、日付単位に.gzされています。

$ ls -1 accesslogs
access_log-20180602.gz
access_log-20180603.gz
access_log-20180604.gz
access_log-20180605.gz
access_log-20180606.gz
access_log-20180607.gz
access_log-20180608.gz
access_log-20180609.gz
access_log-20180610.gz
access_log-20180611.gz
access_log-20180612.gz
access_log-20180613.gz
access_log-20180614.gz

...

access_log-20181101.gz
access_log-20181102.gz
access_log-20181103.gz
access_log-20181104.gz
access_log-20181105.gz
access_log-20181106.gz
access_log-20181107.gz
access_log-20181108.gz
access_log-20181109.gz
access_log-20181110.gz
access_log-20181111.gz
access_log-20181112.gz
access_log-20181113.gz

...

access_log-20181201.gz
access_log-20181202.gz
access_log-20181203.gz
access_log-20181204.gz
access_log-20181205.gz
access_log-20181206.gz
access_log-20181207.gz
access_log-20181208.gz
access_log-20181209.gz

アクセスログの中身は、こんな感じです。

172.19.33.212 - - [30/Nov/2018:05:44:37 +0900] "GET /signin HTTP/1.1" 200 8276 9986 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
172.24.35.22 - - [30/Nov/2018:07:39:46 +0900] "GET /styles/style.css HTTP/1.1" 304 - 11265 "http://example.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
172.24.35.22 - - [30/Nov/2018:07:39:46 +0900] "GET /images/logo.svg HTTP/1.1" 304 - 11978 "http://example.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"

これらのログファイルを、Embulkを使用してElasticsearchに放り込んでみましょう。

環境

今回の実行環境は、こちらです。

$ 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


$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

Embulkは172.17.0.2、ElasticsearchとKibanaは172.17.0.3でSingle Nodeで動かすものとします。

Embulkのインストール

EmbulkのQuick Startに沿って、インストールしてみます。

Linux & Mac & BSD

$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

ElasticsearchとKibanaのインストール

ElasticsearchとKibanaをインストールします。

それぞれ、ダウンロードページから取得して起動。

Elasticsearch。

$ $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.3.tar.gz
$ tar xf elasticsearch-6.5.3.tar.gz
$ cd elasticsearch-6.5.3
$ vim config/elasticsearch.yml     # 設定変更
$ bin/elasticsearch

Elasticsearchは、Single Node向けに設定変更します。また、リモートホストからのアクセスも許可しておきます。

network.host: 0.0.0.0
discovery.type: "single-node"

Kibana。

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.3-linux-x86_64.tar.gz
$ tar xf kibana-6.5.3-linux-x86_64.tar.gz
$ cd kibana-6.5.3-linux-x86_64
$ vim config/kibana.yml      # 設定変更
$ bin/kibana

Kibanaは、リモートホストからのアクセスを許可しておきます。

server.host: "0.0.0.0"

Apacheのアクセスログを、Elasticsearchに放り込む

では、Apacheのアクセスログを、Embulkを使ってElasticsearchに投入したいと思います。

このパターンの場合、こちらのページを参考にするとよいでしょう。

Scheduled bulk data loading to Elasticsearch + Kibana 5 from CSV files

EmbulkからElasticsearchのデータを投入するために、プラグインを追加します。

Elasticsearch output plugin for Embulk

$ embulk gem install embulk-output-elasticsearch

次に、読み込むファイルが置かれたディレクトリと出力先の設定をシードとして作成します。

seed.yml

in:
        type: file
        path_prefix: ./accesslogs
out:
        type: elasticsearch
        index: embulk
        index_type: embulk
        nodes:
          - host: 172.17.0.3

Elasticsearchのインデックス名およびタイプ名は、embulkとします。

このシードの設定を元に、「embulk guess」を実行して、設定ファイルを生成します。

$ embulk guess seed.yml -o config.yml

すると、中身がこのようになります。

config.yml

in:
  type: file
  path_prefix: ./accesslogs
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: LF
    type: csv
    delimiter: ;
    quote: null
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: 'aaa.bbb.ccc.ddd - - [01/Nov/2018:03:13:14 +0900] "GET /index.html HTTP/1.1"
        200 164373 614058 "-" "User-Agent"', type: string}
out:
  type: elasticsearch
  index: embulk
  index_type: embulk
  nodes:
  - {host: 172.17.0.3}

embulk guessでは、入力ファイルのフォーマット、圧縮形式などを推測してくれたりするのですが、フォーマットの点ではちょっと変なことになっています。

ところで、今回のアクセスログのフォーマットは、実はデフォルトから少し変えていたりします。

    LogFormat "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" combined

このパースには、次のプラグインを使ってパースしましょう。

Apache CustomLog parser plugin for Embulk

インストール。

$ embulk gem install embulk-parser-apache-custom-log

設定ファイルを、このように変更します。formatには、ログフォーマットをそのまま記載。

config.yml

in:
  type: file
  path_prefix: ./accesslogs
  decoders:
  - {type: gzip}
  parser:
    type: apache-custom-log
    format: "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\""
out:
  type: elasticsearch
  index: embulk
  index_type: embulk
  nodes:
  - {host: 172.17.0.3}

では、この設定ファイルを使って実行。

$ embulk run config.yml

Kibanaにデータが入ったので、「Discovery」でインデックスに対する定義を行い、表示。

時刻のフィールドは、request-timeです。

で、データが入りました、と。
※除外したいログが検索条件に入っていますが…

こんな感じで、Fluendと似たステップでInput → Parse → Outputという流れでデータロードを実現できます。

プラグインには以下のような種類があり、入出力や加工などで活用しましょう。

  • Input plugin
  • Output plugin
  • Filter plugin
  • File parser plugin
  • File decoder plugin
  • File formatter plugin
  • File encoder plugin
  • Executor plugin

Configuration / built in

Embulk plugins