在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/
スクリーンショット 2017-12-14 2.45.25.png

总结

如果使用fuluentd或者Logstash,只需确保索引的模板正确设置,就能直接显示出来。
但是如果很难将这些工具安装到服务器上,或者只想通过访问日志进行调查和确认的话,
我认为这些工具还是很方便的。
如果能进一步完善模板并集中收集旧系统的日志,那就更好了。

广告
将在 10 秒后关闭
bannerAds