Elasticsearchにeclogを追加

https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html

必要に応じて/etc/elasticsearch/elasticsaerch.ymlに以下を追加した.

ingest.geoip.downloader.enabled: false  # disable geoip download
xpack.security.enabled: false  # disable security plugin
cluster.routing.allocation.disk.threshold_enabled: false  # disable storage capacity check

必要に応じて /etc/kibana/kibana.yml を以下に編集した.

server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

ハーバード大学のeclogをダウンロードしてeclog.csvとして保存する.

https://dataverse.harvard.edu/dataverse/eclog

30万行ごとにsplitコマンドでログを分割する.

split -l 300000 eclog.csv

Fluentdをインストールする.

https://docs.fluentd.org/installation

Fluentdの設定ファイル /etc/td-agent.conf を作成する.

<source>
  @type tail
  path /home/ono/eclog/*.log
  # path /home/ono/eclog/xem.log
  pos_file /tmp/ono.pos
  tag nginx.access
  <parse>
    @type tsv
    keys IpId,UserId,TimeStamp,HttpMethod,Uri,HttpVersion,ResponseCode,Bytes,Referrer,UserAgent
  </parse>
</source>

<match nginx.access>
  # @type stdout
  @type elasticsearch
  host localhost
  port 9200
  index_name koyama
</match>

Fluentdを起動する.

sudo systemctl restart td-agent

以下の convert.py を使い,CSV形式のログ・ファイルから,タイムスタンプの形式を変更したTSV形式のログファイルを生成する.

import csv
import datetime
import glob

def convert_utc(log_file):
    log_buffer = []
    # IpId,UserId,TimeStamp,HttpMethod,Uri,HttpVersion,ResponseCode,Bytes,Referrer,UserAgent
    with open(log_file) as f:
        reader = csv.reader(f)
        for data in reader:
            try:
                raw_time_stamp = int(data[2])
                delta = datetime.timedelta(microseconds=raw_time_stamp // 10)
                base = datetime.datetime(year=1, month=1, day=1, tzinfo=datetime.timezone.utc)
                t = base + delta
                data[2] = t.strftime("%Y/%m/%d %H:%M:%S")
                tsv = "\t".join(data)
                log_buffer.append(tsv + "\n")
                # print(log_buffer)
                # break
            except Exception as e:
                print(e)
                print(data)
                continue
    with open(log_file + ".log", mode="w") as f:
        f.writelines(log_buffer)

file_list = glob.glob("x??")
## print(file_list)
for file_name in file_list:
    convert_utc(file_name)

生成されたファイル一覧の例

xaf.log  xam.log  xat.log  xba.log

生成されたファイルの中身の例(TSV形式)

8153PL	-	2019/12/05 22:06:27	GET	/images/mini/100px_image5802.jpg	HTTP/1.1	200	10450	https://shop.our-internet-company.pl/	Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
8153PL	-	2019/12/05 22:06:28	GET	/images/mini/100px_image1498.jpg	HTTP/1.1	200	12378	https://shop.our-internet-company.pl/	Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0

Kibanaにアクセスする.Kibana Index Patternの設定を行うと以下が表示される.