用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的术语。
安装
您可以使用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的配置。
-
- 选择左侧栏的管理 > 索引模式
-
- 在索引名称或模式中输入索引名称 access_log
- 在时间字段名称中选择日期类型的请求时间,并点击创建
可视化
-
- 选择图表类型(我忘了,好像是底部的柱状图)
-
- 选择可视化菜单
- 在Y轴选择Count,在X轴选择request-time,点击蓝色的播放按钮。
是的!
沉迷的要点
-
- すべて最新版を選択したため、意外と情報が少なかった。
-
- 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 なのに気づかずデータが表示されないと小一時間悩みました。