用 vagrant 安裝 ELK

啟動 ELK

logstash

讀取現有的 log

啟動 logstash

清除掃描記錄

elasticsearch

清除資料

kibana

問題

解決 utf-16le 中文亂碼問題

把 Log 中的時間字串抽出來

維運

用 vagrant 安裝 ELK

網路上找到有人用 vagrant + puppet 建立好一個 ELK 環境。

mkdir ~/elk

cd ~/elk

git clone https://github.com/comperiosearch/vagrant-elk-box.git

cd ~/elk/vagrant-elk-box

修改 ./setup.sh # 此為 vagrant 第一次啟動要執行的腳本

主要修改 puppet 要抓下來的程式版本。

#!/usr/bin/env bash

# this script installs the puppet modules we need,

#and tries to do tricks with setting local repository for ubuntu updates

# Install wget

sudo apt-get install -qy wget;

sudo apt-get install -qy vim;

sed -e '/templatedir/ s/^#*/#/' -i.back /etc/puppet/puppet.conf

## set local/fastest mirror and local timezone

mv /etc/apt/sources.list /etc/apt/sources.list.orig

cat > /etc/apt/sources.list <<EOF

deb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe multiverse

deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-updates main restricted universe multiverse

deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-backports main restricted universe multiverse

deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-security main restricted universe multiverse

EOF

sudo apt-get update

export tz=`wget -qO - http://geoip.ubuntu.com/lookup | sed -n -e 's/.*<TimeZone>\(.*\)<\/TimeZone>.*/\1/p'` &&  sudo timedatectl set-timezone $tz

mkdir -p /etc/puppet/modules;

if [ ! -d /etc/puppet/modules/file_concat ]; then

 puppet module install ispavailability/file_concat

 # puppet module install electrical-file_concat --version 1.0.1

fi

if [ ! -d /etc/puppet/modules/apt ]; then

 puppet module install puppetlabs-apt --version 1.8.0

fi

if [ ! -d /etc/puppet/modules/java ]; then

 puppet module install puppetlabs-java

fi

if [ ! -d /etc/puppet/modules/elasticsearch ]; then

 puppet module install elasticsearch-elasticsearch

fi

if [ ! -d /etc/puppet/modules/logstash ]; then

 puppet module install elasticsearch-logstash --version 0.5.1

fi

if [ ! -f /etc/init.d/kibana ]; then

 sudo cp /vagrant/kibana4_init /etc/init.d/kibana

 sudo sed -i 's/\r//' /etc/init.d/kibana

 sudo chmod +x /etc/init.d/kibana

 sudo update-rc.d kibana defaults

 # wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz

fi

參考:

啟動 ELK

vagrant up

啟動後就能透過 http://localhost:5601/ 開啟 kbana 網頁。vagrant 會同步資料夾,宿主端 Vagrantfile 檔案所在的資料夾位置,會對應到 VM 裡的 /vagrant。

logstash

讀取現有的 log

手上已經有一堆 log 檔案,logstash 支援讀取檔案然後塞到 elasticsearch。下面是為了支援現有 log 的一個 logstash 設定檔範例,啟動 loagstash 載入該設定檔即可:

input {

  file {

    path => ["/path/to/your/log/*.log"]

    start_position => "beginning"    

    codec => plain{charset => "UTF-8"}

    type => foo

  }

}

filter {

  grok {

      match => ["message",  "\((?<log_datestamp>.+?)\) %{GREEDYDATA:message_wo_datestamp}"]

  }

  date {

      match => ["log_datestamp", "yyyy-MM-dd HH:mm:ss"]

  }

}

output {

  elasticsearch {

    host => "127.0.0.1"

    cluster => "vagrant_elasticsearch"

    protocol => "http"

  }

}

啟動 logstash

# logstash 1.x 啟動方式

/opt/logstash/bin/logstash agent -f /path/to/your/logstash.conf

# logstash 5.x 啟動方式

/usr/share/logstash/bin/logstash -f /path/to/your/logstash.conf --config.reload.automatic

清除掃描記錄

強迫 logstash 每次重啟都會再次 parse log 檔案。在設定檔中設定 sincedb_path。

input {

  file {

    sincedb_path => "/dev/null"

  }

}

紀錄 parse log 紀錄的檔案預設會在 $HOME/.sincedb*,若想要重新 parse log 檔案,直接刪除 $HOME/.sincedb* 即可。

參考:

elasticsearch

以下是新的專有名詞對照一般資料庫的對照:

elasticsearch

資料庫

index

database

type

table

fields

columns

documents

rows

螢幕快照 2017-02-24 下午3.49.32.png

清除資料

curl -XDELETE 'http://localhost:9200/_all' // 清除所有資料

curl -XDELETE "http://localhost:9200/logstash-$days_30_before" // 清除指定的 index

kibana

http://localhost:5601/ 開啟本地端的 kibana 介面,一開始要建立一個 index 預設為 logstash-*。建立完後,整個介面分成三大分頁:

參考:

問題

解決 utf-16le 中文亂碼問題

utf-16le 的檔案總是一半顯示亂碼一半顯示正常,就算在 logstash.conf 設定好 codec 也是如此,最終利用 iconv 先將檔案轉成 utf-8 編碼即顯示正常。

iconv -f UTF-16LE -t UTF-8 /path/to/utf16lelog.log  > /path/to/utf8log.log

把 Log 中的時間字串抽出來

用 Log 裡的時間來取代當下插入 elasticsearch 的時間。

參考:

維運

參考: