在Kibana上将访问来源地区可视化
当我想查看一些简单的内容时,通过访问日志来获取,我曾经尝试过一件事情。下面是关于这件事情的描述。
验证的触发原因 de
在发布后或功能更新后,或者在访问量突然增加时,经常会查看访问日志。
然而,除了上述要求外,我也希望能够随意地观察,例如,哇,这个地区的访问量意外地多,在喝咖啡的同时,我想着这个服务的扩展。
我們這次打算使用Kibana的視覺化功能來查看日誌。
要做的事情
-
- Kibanaでどのあたりの地域からアクセスがあるのかを見たい
-
- Elasticsearchを使う
-
- ログファイルだけあれば解析できるように、embulkでElasticsearchで投入する
-
- どこでも気軽に試せるようにdockerコンテナで処理する
-
- 今回のエントリー用にログデータはダミーデータを利用する
- Elasticsearchに入れるデータはIPと位置情報のみ
这次的构成
- access_kibana
- docker
- elasticsearch
- config
schema.json
Dockerfile
- embulk
- config
embulk_config.yml
Dockerfile
- kibana
Dockerfile
docker-compose.yml
- log
Gemfile
sample_log.rb
使用Docker容器设置环境。
准备Dockerfile。
- elasticsearch
FROM elasticsearch:5.6.5
# x-pack
RUN elasticsearch-plugin install --batch x-pack
# kuromoji
RUN elasticsearch-plugin install analysis-kuromoji
- kibana
FROM kibana:5.6.5
# x-pack
RUN kibana-plugin install x-pack
- embulk
我們將使用在Dockerhub上提供的embulk Dockerfile。
docker-compose 是一个开源的容器编排工具,用于定义和运行多容器的 Docker 应用程序。
准备并统一管理Docker Compose。
version: '2'
services:
elasticsearch:
build: elasticsearch
volumes:
- es-data:/usr/share/elasticsearch/data
- ./elasticsearch/config:/usr/share/elasticsearch/config
ports:
- 9200:9200
expose:
- 9300
ulimits:
nofile:
soft: 65536
hard: 65536
network_mode: "bridge"
kibana:
build: kibana
links:
- elasticsearch:elasticsearch
ports:
- 5601:5601
network_mode: "bridge"
embulk:
build: embulk
links:
- elasticsearch:elasticsearch
volumes:
- ./embulk/config:/opt/config
- ../log:/opt/log
network_mode: "bridge"
volumes:
es-data:
driver: local
networks:
default:
external:
name: bridge
启动Docker容器。
cd docker
docker-compose up -d
使用apache-loggen生成访问日志。
这次我们将使用apache-loggen创建虚拟的访问日志。
gem install apache-loggen --no-ri --no-rdoc -V
apache-loggen --rate=10 --limit=10 > opt/log
将位置信息添加到日志中
我们将通过IP推测位置信息。
- gem
# Gemfileに追加
gem 'maxminddb'
- gem install
bundle install --path vdendor/bundle
-
- 位置情報の取得
-
- 位置情報にはMaxMindのオープンソースデータを利用します
-
- GeoLite2-City をダウンロードする
-
- ruby
- IPと位置情報を紐付けデータを再出力します
require 'MaxMindDB'
db = MaxMindDB.new('GeoLite2-City.mmdb')
readFile = "log/orig.log"
outFile = "log/geoip.log"
outIp = []
begin
File.open(readFile){|file|
file.each_line{|access|
access.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){|md|
ip = md[0]
ret = db.lookup(ip)
str = "#{ip},¥"#{ret.location.latitude},#{ret.location.longitude}¥""
outIp << str
}
}
}
# 例外は小さい単位で捕捉する
rescue SystemCallError => e
puts %Q(class=[#{e.class}] message=[#{e.message}])
rescue IOError => e
puts %Q(class=[#{e.class}] message=[#{e.message}])
end
f = File.open(outFile, "w")
outIp.each { |s| f.puts(s) }
初始化Elasticsearch
如果不指定任何模板,它将无法识别geo_point,因此需要明确定义类型。
这次,我们将只注册IP和位置信息。
利用docker-compose的volume功能,在[./elasticsearch/config]路径下准备配置文件。
/* schema.json */
{
"mappings": {
"geo_ips": {
"properties": {
"ip": {
"type": "string",
"index" : "not_analyzed"
},
"location": {
"type": "geo_point"
}
}
}
}
}
}
- 作ったtemplateを元に indexの作成
curl -XPUT localhost:9200/geo_ips --data-binary @schema.json
创建embulk_config
创建一个设置文件,将CSV信息导入到Elasticsearch中。
- embulk_config.yml
in:
type: file
path_prefix: /opt/log/geoip
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
escape: ''
header_line: true
columns:
- {name: "ip", type: string}
- {name: "location", type: string}
out:
type: elasticsearch
mode: insert
nodes:
- {host: elasticsearch, port: 9200}
index: geo_ips
index_type: geo_ips
运行Elasticsearch
在Docker容器上运行
embulk run embulk_config.yml
在Kibana中确认
localhost:5601/
总结
如果使用fuluentd或者Logstash,只需确保索引的模板正确设置,就能直接显示出来。
但是如果很难将这些工具安装到服务器上,或者只想通过访问日志进行调查和确认的话,
我认为这些工具还是很方便的。
如果能进一步完善模板并集中收集旧系统的日志,那就更好了。