elk日誌系統01-安裝配置

一、elk介紹

1.ElasticSearch:

節點(Node):節點是一個ES的實例,一般一臺主機上部署一個節點-
集羣(Cluster):集羣由若干節點組成,和任意節點的通信等價於和集羣的 通信
分片(Shard):一個索引會分成多個分片存儲,分片數量在索引建立後不可更改
副本(Replica):副本是分片的一個拷貝,目的在於提高系統的容錯性和搜索的效率
索引(Index):類似數據庫的庫
類型(Type):類似數據庫的表
文檔(Document):類似數據庫的行,包含一個或多個Field
字段(Field):搜索的最小單元,可通過Mapping定義不同的屬性(比如可否被搜索)

2.Logstash:

設計及架構

LogStash由JRuby語言編寫,基於消息(message-based)的簡單架構,並運行在Java虛擬機(JVM)上。不同於分離的代理端(agent)或主機端(server),LogStash可配置單一的代理端(agent)與其它開源軟件結合,以實現不同的功能。

在LogStash的生態系統中,主要分爲四大組件:

  • Shipper:發送事件(events)至LogStash;通常,遠程代理端(agent)只需要運行這個組件即可;
  • Broker and Indexer:接收並索引化事件;
  • Search and Storage:允許對事件進行搜索和存儲;
  • Web Interface:基於Web的展示界面

LogStash的優勢:

  1. 對日誌數據更好的語法分析功能
  2. 更加靈活的日誌存儲方式
  3. 附帶搜索和目錄功能
  4. 易於安裝、可擴展、性能良好等
  • 正是由於以上組件在LogStash架構中可獨立部署,才提供了更好的集羣擴展性。

在大多數情況下,LogStash主機可分爲兩大類:

代理主機(agent host):作爲事件的傳遞者(shipper),將各種日誌數據發送至中心主機;只需運行Logstash 代理(agent)程序;
中心主機(central host):可運行包括中間轉發器(Broker)、索引器(Indexer)、搜索和存儲器(Search and Storage)、Web界面端(Web Interface)在內的各個組件,以實現對日誌數據的接收、處理和存儲。

3.Kibana:

  • Kibana是一個基於瀏覽器頁面的Elasticsearch前端展示工具。

二、安裝elk

  • 本文將安裝Elasticsearch-1.7.2, Logstash-1.5.5, Kibana-4.1.1。 請注意版本要求,有些組件需要相對應的版本。
    elk可以分佈式部署在不同的機器上,收集展示端在一臺機器上部署,客戶端只部署logstash,目錄統一在/data/Elk

1.安裝java和redis

  • Elasticsearch和Logstash需要Java8,此過程省略。
  • 安裝3.X,過程省略,在收集端安裝完啓動即可,端口爲默認

2.安裝Elasticsearch

把tar包解壓到/data/Elk
修改配置文件

cd /data/Elk/elasticsearch/
vim config/elasticsearch.yml
path.data: /data/Elk/logdata    #指定elasticsearch收集日誌數據存放目錄
network.host: 1.1.1.11          #指定主機,默認指本機

3.安裝Elasticsearch

安裝Elasticsearch插件

elasticsearch 作爲一個系統service應用 ,可以安裝elasticsearch-servicewrapper插件。
https://github.com/elasticsearch/elasticsearch-servicewrapper下載該插件後,解壓縮。將service目錄拷貝到elasticsearch目錄的bin目錄下。運行這個插件的好處是:elasticsearch需要的jvm參數和其它配置都已經配置好了,非常方便。

chmod +x bin/*
集羣管理:./bin/plugin -install mobz/elasticsearch-head         http://1.1.1.11:9200/_plugin/head/
集羣性能監控:./bin/plugin -install lukas-vlcek/bigdesk/2.5.0    http://1.1.1.11:9200/_plugin/bigdesk/
#管理和監控:./bin/plugin -i elasticsearch/marvel/latest         http://1.1.1.11:9200/_plugin/marvel/
#./bin/plugin -r elasticsearch/marvel/latest   卸載插件
#集羣管理: ./bin/plugin -install lmenezes/elasticsearch-kopf     http://1.1.1.11:9200/_plugin/kopf/
  • 注:對於插件的安裝和更新,默認走的Gem源爲 https://rubygems.org,對於咱們國內網絡來說是出奇的慢或是根本無法訪問(爬梯子除外),在安裝或是更新插件是,可以嘗試修改目錄下 Gemfile 文件中的 source爲淘寶源https://ruby.taobao.org,這樣會使你的安裝或是更新順暢很多。

4.安裝kibana

把tar包解壓到/data/Elk
修改配置文件

cd /data/Elk/kibana/
vim config/kibana.yml 
port: 5601                 #指定端口,默認是5601
host: "1.1.1.11"           #指定主機
elasticsearch_url: "http://1.1.1.11:9200"   #指定elasticsearch
  • 配置文件中指明kibana偵聽5601端口並且通過9200端口從elasticsearch裏面獲取數據。

5.安裝Logstash

把tar包解壓到/data/Elk,服務端和客戶端都要安裝

服務端配置

  • cat /data/Elk/logstash/conf/logstash_nginx_tomcat.conf
input {
    redis {
        host => "1.1.1.11"
        port => 6379 
        type => "nginx_logs"
        data_type => "list"
        key => "db:nginx"
    }
    redis {
        host => "1.1.1.11"
        port => 6379 
        type => "tomcat_logs"
        data_type => "list"
        key => "db:tomcat"
    }
}
filter {
    if [type] == "nginx_logs" {
    grok {
        match => { "message" => "%{IPORHOST:clientip} \- %{NOTSPACE:remoteuser} \[%{HTTPDATE:timestamp}\] %{NUMBER:response} \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:bytes} \"%{NOTSPACE:referrer}\" \"%{GREEDYDATA:useragent}\" %{IPORHOST:proxyip} \"%{IPORHOST:apiip}(?::%{POSINT:apiport})?\" \"%{NUMBER:elapsedtime}\"" }
        remove_field => [ "message"]
    }
    mutate {
        split => { "elapsedtime" => "." }
    }
    mutate {
        join => { "elapsedtime" => "" }
    }
    mutate {
        convert => { "elapsedtime" => "float" }
    }
    date {
        match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] 
    }
    useragent{
        source => "useragent"
    }   
    geoip {
            source => "clientip"
    }
}
  if [type] == "tomcat_logs" {
       grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:hostname} %{LOGLEVEL:loglevel} %{GREEDYDATA:content}" }
        remove_field => [ "message"]
        }
        date {
        match => [ "timestamp", "ISO8601","yyyy-M-dd HH:mm:ss"]
        }
     }
}
output {
  if [type] == "nginx_logs" {
    elasticsearch { 
        protocol => "http"
        host => "1.1.1.11"
        index => 'nginx_log_%{+YYYY_MM_dd}'
        }
    }
   if [type] == "tomcat_logs" {
    elasticsearch {
        protocol => "http"
        host => "1.1.1.11"
        index => 'tomcat_log_%{+YYYY_MM_dd}'
        }
    }
}

客戶端配置

  • cat /data/Elk/logstash/conf/logstash_nginx_tomcat.conf
input {
    file {
        path => ["/usr/local/nginx/logs/*.log"]
        start_position => beginning
    type => "nginx_logs"
    }
    file {
        path => ["/data/tomcat/*/logs/catalina.out"]
        start_position => beginning
    type => "tomcat_logs"
    }
}
output {
    if [type] == "nginx_logs" {
            redis {
            host => "1.1.1.11"
            port => 6379
            data_type => "list"
            key => "db:nginx"
        }
    }   
    if [type] == "tomcat_logs" {
        redis {
            host => "1.1.1.11"
            port => 6379
            data_type => "list"
            key => "db:tomcat"
            batch_events => 2
            }
    }
}

三、啓動ELK

1.給命令授權

chmod +x /data/Elk/elasticsearch/bin/*
chmod +x /data/Elk/kibana/bin/*
chmod +x /data/Elk/kibana/node/bin/*
chmod +x /data/Elk/logstash/bin/*
chmod +x /data/Elk/logstash/vendor/jruby/bin/*

2.elk啓動腳本

start-es.sh
#!/bin/bash
/data/Elk/elasticsearch/bin/elasticsearch  &
sleep 2

shutdown-es.sh
#!/bin/bash
ps -ef| grep -e elasticsearch | grep -v grep | awk '{system("kill -9 " $2)}'

start-logstash.sh
#!/bin/bash
/data/Elk/logstash/bin/logstash -w 5 -f /data/Elk/logstash/conf/logstash_nginx-tomcat.conf  -l  /data/Elk/logstash/bin/stash_log.txt &
sleep 3

shutdown-logstash.sh
#!/bin/bash
ps -ef| grep -e logstash | grep -v grep | awk '{system("kill -9 " $2)}'

start-kibana.sh
#!/bin/bash
/data/Elk/kibana/bin/kibana &

shutdown-kibana.sh
#!/bin/bash
ps -ef| grep -e kibana | grep -v grep | awk '{system("kill -9 " $2)}'

start-all.sh
#!/bin/bash
/data/Elk/elasticsearch/bin/elasticsearch  &
sleep 2
/data/Elk/logstash/bin/logstash -w 5 -f /data/Elk/logstash/conf/logstash_nginx-tomcat.conf  -l  /data/Elk/logstash/bin/stash_log.txt &
sleep 2
/data/Elk/kibana/bin/kibana &

shutdown-all.sh
#!/bin/bash
ps -ef| grep -e kibana | grep -v grep | awk '{system("kill -9 " $2)}'
ps -ef| grep -e logstash | grep -v grep | awk '{system("kill -9 " $2)}'
ps -ef| grep -e elasticsearch | grep -v grep | awk '{system("kill -9 " $2)}'

3.修改日誌格式

以分析nginx日誌爲例,將nginx的日誌格式改爲如下:
log_format main ‘remoteaddr remote_user [timelocal] status ’
‘”request" body_bytes_sent “httpreferer http_user_agent" proxy_add_x_forwarded_for “ upstream_addr" "$request_time”’;
access_log /var/log/nginx/access.log main;
* 啓動nginx和tomcat並訪問項目

四、查看ELK

至此,整個搭建過程已完成,如需收集其他日誌,應按要求制定相應的匹配規則,設置字段。

五、elk優化(copy by network):

1.日誌類別與處理方法

Apache日誌:自定義apache輸出日誌格式,json輸出,無需filter參與
Tomcat日誌:需將多行日誌合併至一個事件中,並排除空白行

2.注意事項

Redis:部署多臺,僅提供高可用作用,無分擔負載作用,可使用ZeroMQ代替

ElasticSearch:

   1.LogStash默認爲每一天創建1index,可手動    刪除index 
    curl -XDELETE http://127.0.0.1:9200/logstash-2013.12.19 
    shell優化腳本:https://github.com/cnf/logstash-tools/blob/master/elasticsearch/clean-elasticsearch.sh 
   2.優化index: 
    curl -XPOST 'http://127.0.0.1:9200/logstash-2013.12.19/_optimize' 
    curl -XPOST 'http://127.0.0.1:9200/_optimize' # 優化所有index 
    curl 'http://127.0.0.1:9200/logstash-2013.12.19/_stats?clear=true&store=true&pretty=true' 
  • 查看index的大小,index過多會影響優化耗時,定期可刪除數據

3.其他腳本

  • clean_es.sh
    01
#!/bin/bash
daysback=3
if [ ! -z $1 ]; then
    daysback=$1
fi
start=8
end=`expr $start \+ $daysback`
if [ $? == 0 ]; then
    for i in `seq $start $end`; do
        d=`date --date "$i days ago" +"%Y.%m.%d"`
        curl -XDELETE http://localhost:9200/logstash-$d > /dev/null 2>&1
    done
else
    echo "Invalid number of days specified, aborting"
fi
curl -XPOST 'http://localhost:9200/_optimize'

02

#!/bin/bash
#date=$(date -d "today" '+%Y-%m-%d-%H%M')
date=$(date -d "today" '+%Y-%m-%d')
date7=$(date -d "7 days ago" '+%Y_%m_%d')
save_days=5
filelist=`ls /data/Elk/elasticsearch/data/elasticsearch/nodes/`
for file in $filelist
do
  cd /data/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/
  /data/Elk/shutdown_elastic.sh
  sleep 10
  ls /data/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/*"$date7"
  rm -rf  /data/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/*"$date7"
  /data/Elk/start_elastic.sh
  #find /home/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/ -exec ls -l {} \;
 # find /home/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/ -mtime +${save_days} -exec ls  {} \;
#  find /opt/huiti/interface/$file/indices -name "*.log" -mtime +15 -exec rm -rf {} \;
#  find /opt/huiti/interface/$file/indices -name "*.txt" -mtime +15 -exec rm -rf {} \;
done

  • 全文完~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章