用Embulk+Elasticsearch+Kibana来查看Apache的访问日志

我之前尝试过使用Embulk将访问日志放入MySQL,但由于想要能够以图表形式查看,所以打算试试ElasticSearch+Kibana。

请先安装Java,因为它是必需的。
操作系统环境是macOS Sierra。

$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

弹性搜索

Elasticsearch 是一种数据搜索和分析引擎。

Elasticsearch是基于Lucene的分布式处理多租户支持的搜索引擎。虽然是开源软件,但目前由总部位于荷兰阿姆斯特丹的Elastic公司主导开发。

据说这个全文检索软件是基于用Java编写的 Apache Lucene(阿帕奇卢西恩)的。

用词

理解Elasticsearch的术语。

用語説明インデックスRDMSでのテーブルにあたるものドキュメントRDMSでのレコードにあたるものドキュメントタイプElasticsearch では1つのインデックス内に異なる構造のドキュメントを格納できる。ドキュメントタイプはどの構造かを識別するものマッピングインデックスの構造の定義フィールドRDMSでのカラムにあたるもの

安装

您可以使用Homebrew进行安装。

$ brew install elasticsearch
  :
Data:    /usr/local/var/elasticsearch/elasticsearch_yutasega/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_yutasega.log
Plugins: /usr/local/Cellar/elasticsearch/5.0.2/libexec/plugins/
Config:  /usr/local/etc/elasticsearch/
plugin script: /usr/local/Cellar/elasticsearch/5.0.2/libexec/bin/plugin

To have launchd start elasticsearch now and restart at login:
  brew services start elasticsearch
Or, if you don't want/need a background service you can just run:
  elasticsearch
  :

执行以下命令会在前台执行。
由于标准输出会输出日志,所以我们可以根据日志进行故障排除。

$ elasticsearch

已经确认启动。
已安装了最新的5.0.2版本。

$ curl -X GET http://localhost:9200/ 
{
  "name" : "ZYNFZGW",
  "cluster_name" : "elasticsearch_yutasega",
  "cluster_uuid" : "VEGuf46HTfOG0Sl2us8IQg",
  "version" : {
    "number" : "5.0.2",
    "build_hash" : "f6b4951",
    "build_date" : "2016-11-24T10:07:18.101Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.1"
  },
  "tagline" : "You Know, for Search"
}

Kibana 可视化工具

Kibana 是 elastic 公司的产品,与 Elasticsearch 一样,它可以可视化 Elasticsearch 的数据。

安装

安装 Kibana 需要安装 node.js。

Node.js (简称Node)

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash
source ~/.bashrc

Kibana 是指的是一个用于可视化和分析 Elasticsearch 数据的开源工具。

按照这里所列出的方法进行安装。

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-5.0.2-darwin-x86_64.tar.gz
$ tar -xzf kibana-5.0.2-darwin-x86_64.tar.gz
$ cd kibana/

开始

确认 Elasticsearch 的启动后,在另一个终端执行以下操作。

$ ./bin/kibana

确认

在浏览器中访问以下内容。

这样,安装就完成了。

Embulk的配置更改

安装插件

在Embulk中添加一个用于Elasticsearch的插件(embulk-output-elasticsearch_ruby)。

$ embulk gem install embulk-output-elasticsearch_ruby

修改設定文件

将”out”部分从MySQL更改为Elasticsearch。

in:
  type: file
  path_prefix: try1/access_log/sample.access_
  decoders:
  - {type: gzip}
  parser: 
    type: apache-custom-log
    format: "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
out:
  type: elasticsearch_ruby
  nodes:
    - {host: localhost, port: 9200}
  index: access_log
  index_type: site_a

access_log 是索引名称,site_a 对应索引类型。

将数据输入

将映射注册到Elasticsearch。

进行映射(即定义索引的结构)。

{
  "mappings" : {
    "site_a" : {
      "properties" : {
        "remote-host" : { "type" : "string" },
        "remote-log-name" : { "type" : "string" },
        "request-user" : { "type" : "string" },
        "request-time" : { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss z" },
        "request-line" : { "type" : "string" },
        "response-status" : { "type" : "long" },
        "response-bytes" : { "type" : "long" },
        "request-header-Referer" : { "type" : "string" },
        "request-header-User-Agent" : { "type" : "string" }
      }
    }
  }
}

用json格式来描述类似上述的映射信息。

$ curl -XPUT 'localhost:9200/access_log' -d @mapping.json
{"acknowledged":true,"shards_acknowledged":true}

可以用curl进行配置。access_log是要注册的索引名称。
现在准备工作完成。

执行Embulk

$ embulk run config.yml

数据的导入已经完成了。

你可以通过访问以下的URL来确认是否成功获取了数据。

Elasticsearch 数据查看
http://localhost:9200/access_log/_search?pretty

确认映射,请在以下链接进行:
http://localhost:9200/access_log/_mapping?pretty

如果映射的定义不正确,可以使用下面的命令来删除并重新设置。

$ curl -XDELETE 'localhost:9200/access_log'
$ curl -XPUT localhost:9200/access_log -d @mapping.json

在Kibana中查看图表

使用Management进行IndexPattern的配置。

    1. 选择左侧栏的管理 > 索引模式

 

    1. 在索引名称或模式中输入索引名称 access_log

 

    在时间字段名称中选择日期类型的请求时间,并点击创建
スクリーンショット 2016-12-09 20.53.32.png

可视化

    1. 选择图表类型(我忘了,好像是底部的柱状图)

 

    1. 选择可视化菜单

 

    在Y轴选择Count,在X轴选择request-time,点击蓝色的播放按钮。
スクリーンショット 2016-12-09 21.08.43.png

是的!

沉迷的要点

    • すべて最新版を選択したため、意外と情報が少なかった。

 

    • Embulk が生成する日付に「2016-01-05 15:19:56 UTC」のように「UTC」が入っているのですが、マッピングの Date format でどう書けばいいかわからず一向に取り込めなかった(zだった)

 

    マッピング設定を変えて試していたところ Elasticseach で下記のエラーが出てデータが取り込めなくなった。
[2016-12-09T20:36:44,640][DEBUG][o.e.a.a.i.a.TransportIndicesAliasesAction] [ZYNFZGW] failed to perform aliases
org.elasticsearch.indices.InvalidAliasNameException: Invalid alias name [access_log], an index exists with the same name as the alias

当删除所有别名后问题解决了。
请访问以下网址,并删除显示的除了 “.kibana” 之外的所有别名。
http://localhost:9200/_aliases/

{
  "test-access_log-2016.12.09.20.15.37": {
    "aliases": {}
  },
  "access_log-site_a-2016.12.09.20.36.38": {
    "aliases": {}
  },
  ".kibana": {
    "aliases": {}
  },
  "sample-access_log-2016.12.09.20.09.43": {
    "aliases": {}
  },
  "sample-access_log-2016.12.09.20.07.56": {
    "aliases": {}
  },
  "samplesite-access_log-2016.12.09.20.18.51": {
    "aliases": {}
  },
  "test-access_log-2016.12.09.20.11.41": {
    "aliases": {}
  },
  "access_log": {
    "aliases": {}
  }
}
$ curl -XDELETE 'localhost:9200/test-access_log-2016.12.09.20.15.37'
    取り込んだデータが2016年1月のデータで、Kibana の日付フィルタのデフォルトが Last 15 minutes なのに気づかずデータが表示されないと小一時間悩みました。