快速搭建全套ELK日誌分析系統

ELK:Elasticsearch 搜索引擎、Logstash 日誌收集、Kibana 視圖展現
Elasticsearch 搜索引擎
1.mac安裝方式
安裝:

brew  install elasticsearch

啓動:

brew  services start elasticsearch

停止:

brew  services stop elasticsearch

前臺啓動:

elasticsearch

2.官方下載包方式
啓動:cd 進入elasticsearch文件夾bin目錄 sh elasticsearch
安裝head插件
github地址:https://github.com/mobz/elasticsearch-head
下載插件並進入目錄執行npm install和npm install grunt --save命令

cd /Volumes/tool/elasticsearch-head-master 
npm install
npm install grunt --save
啓動 npm run start

啓動成功
接下來讓Elasticsearch連接上head,首先進入到本地安裝到Elasticsearch文件夾中,然後進入config文件夾中修改elasticsearch.yml,在配置文件最下方加上cors配置:


   http.cors.enabled: true
   http.cors.allow-origin: "*"

保存退出並啓動Elasticsearch和head插件,就可以看到elasticsearch已經連接上了head插件。
Elasticsearch主從集羣
修改elasticsearch.yml加入配置


主機配置:
 http.cors.enabled: true
 http.cors.allow-origin: "*"
 #集羣名稱
 cluster.name: ritian
 #節點名稱
 node.name: master
 #指定爲主機 
 node.master: true
 #主機IP,默認端口爲9200
  network.host: 127.0.0.1
從機配置:
 #集羣,這個需要保證和master一致
 cluster.name: ritian
 #節點名稱
 node.name: slave1 
 #綁定IP
 network.host: 127.0.0.1
 #本機端口
 http.port: 9300
#找到master節點,默認端口爲9200
 discovery.zen.ping.unicast.hosts: ["127.0.0.1"]</font>

注意:複製文件的時候需要無data文件夾,如果出現head中檢測不到集羣的情況,可以刪除data文件夾。
Logstash日誌收集解析
官方下載包方式
啓動Logstash 進入logstash/bin目錄啓動logstash.sh 創建logstash.conf
Logstash傳輸日誌到Elasticsearch讀取解析 手輸日誌打印

input{
  stdin{}    #標準寫入
}
output{
   stdout{
    codec=>rubydebug   #標準輸出
   }
}
讀取日誌發送到elasticsearch
input {
    file {
        path => "/usr/local/Cellar/nginx/1.17.3_1/logs/*.log"   # 讀取日誌地址
        start_position => beginning
    }
}
output {
    elasticsearch {
    hosts => "localhost:9200"    #ES端口
    }
}

啓動:

sh logstash -f logstash.conf
在kibana中通過 GET http://localhost:9200/_cat/indices?v 查看日誌文件,點擊 Management選擇kibana下的index patterns創建一個索引來查看日誌 我們要查看logstash的日誌信息,通過輸入logstash-*選擇查詢所有日誌, 然後點擊next step,選擇過濾模式並創建索引模式,點擊Discover並選擇剛創建的索引查看所有日誌信息。 input 配置參考: https://www.elastic.co/guide/en/logstash/current/input-plugins.html output 配置參考: https://www.elastic.co/guide/en/logstash/current/output-plugins.html filter 配置參考: https://www.elastic.co/guide/en/logstash/6.4/filter-plugins.html Logstash Reference:https://www.elastic.co/guide/en/logstash/6.4/index.html

Logstash收集日誌必要點:
1.日誌文件需要有新日誌產生
2.Logstash跟Elasticsearch要能通訊

Logstash去除不需要的字段
去除字段:
1.只能去除_source裏的,非_source裏的去除不了
2.減少ES數據庫大小
3.提升搜索效率
Logstash配置去除不需要的字段

filter{
    grok{
       remove_field=>["message","@version","path"]
   }
}

[]中填寫_source中的字段

Logstash Json格式日誌的採集
Json的好處
1.原生日誌需要做正則匹配,比較麻煩
2.Json格式的日誌不需要正則能直接分段採集

Nginx使用Json格式日誌
修改nginx.conf

    log_format  json '{"remote_ip":"$remote_addr",'
                 '"time_local":"$time_local",'
                 '"body_sent":$body_bytes_sent,'
                 '"responsetime":$request_time,'
                 '"upstreamtime":"$upstream_response_time",'
                 '"upstreamhost":"$upstream_addr",'
                 '"http_host":"$host",'
                 '"method":"$request_method",'                     
                 '"url":"$request_uri",'
                 '"request":"$request",'
                 '"xff":"$http_x_forwarded_for",'
                 '"referer":"$http_referer",'
                 '"agent":"$http_user_agent",'
                 '"response_code":"$status"}';

隱藏原有配置加入新配置
在這裏插入圖片描述
Logstash解析Json日誌

 filter{
      json{
        source => "message"   #會將 message中方的數據解析爲Json格式
        }
    }

Logstash 時間軸自定義

默認ELK時間軸:
1.以發送日誌的時間爲準
2.而Nginx本身記錄着用戶的訪問時間
3.分析Nginx上的日誌以用戶的訪問時間爲準,而不以發送的時間爲準


Logstash的filter裏面加入配置用Nginx用戶訪問時間覆蓋發送日誌時間
time是正則解析對應的名稱 01/Nov/2019:09:27:00 +0800

filter{
  date{
     match => ["time","dd/MMM/yyyy:HH:mm:ss Z"]
     target => "@timetamp"
     }
}
統計Nginx的請求和網頁顯示進行對比 可以看到每分鐘的請求量
cat /usr/local/Cellar/nginx/1.17.3_1/logs/access.log |awk '{print $4}'|cut -b 1-19|sort|uniq -c

不同的時間格式,覆蓋的時候格式要對應

  1.20/Feb/2019:14:50:06 -> dd/MMM/yyyy:HH:mm:ss
  2.2016-08-24 18:05:39,830 -> yyyy-MM-dd HH:mm:ss,SSS

Logstash正則提取Nginx日誌

Nginx日誌說明
日誌記錄:127.0.0.1 - root [01/Nov/2019:09:27:00 +0800] “GET /ui/fonts/inter_ui/Inter-UI-Bold.woff2 HTTP/1.1” 304 0 “http://localhost:8888/app/kibana” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36” “-”
1.訪問地址IP
2.訪問時間
3.請求方式(GET/POST)
4.請求URL
5.狀態碼
6.響應body大小
7.Referer
8.User Agent

Logstash正則提取日誌
1.需要懂得正則,logstash支持普通正則和擴展正則
2.需要了解Grok,利用kibana的Grok學習logstash正則提取過程:
點擊Dev Tools,選擇Grok Debugger,將日誌複製進Sample data中 ,Grok Patern中放入正則表達式。

Grok提取Nginx日誌
1.Grok使用(?提取內容)來提取xxx字段
2.提取客戶端IP: (?[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) 定義字段名爲IP
3.提取時間: [(?

Logstash正則提取Nginx日誌
1.在logstash.conf中加入一段filter代碼
2.加入_grokparsefailure" not in [tags]and “_dateparsefailure” not in [tags]判斷可以防止正則將錯誤輸出到ES

output{
   if "_grokparsefailure" not in [tags]and "_dateparsefailure" not in [tags]{
    elasticsearch{
       hosts=>["http://localhost:9200"] 
     }
  }
}
filter{
  grok{
    match = >{
       "message" => '正則表達式'
      }
   }
}

Kibana 數據展現
1.mac安裝方式
安裝:

   brew  install  kibana	

啓動:

   brew  services start kibana	

關閉:

brew  services stop  kibana	

前臺啓動:

  kibana	
2.官網下載包即可 啓動Kibana 進入kibana/bin目錄sh kibana 啓動,kibana.yml中的配置elasticserch地址配置爲elasticsearch.host:['localhost:9200'],server:host設置爲0.0.0.0供外網訪問

Kibana借用Nginx實現認證

默認的kibana
1.任何人都能無密碼訪問kibana
2.借用Nginx實現認證
3.Nginx控制源IP訪問、Nginx可以使用用戶密碼的方式
4.把kibana監聽在127.0.0.1,然後用Nginx轉發

Nginx兩種限制
注:sodu nginx 查看日誌 mac使用nginx需要自己創建log文件夾以及access.log日誌文件
1.限制源IP訪問,比較安全

  修改nginx.conf  配置 
   location /{
        allow 127.0.0.1;   # allow 允許訪問的IP
        deny  all;   # deny 拒絕訪問
        proxy_pass  http://127.0.0.1:5601/;  #proxy_pass 地址轉發
    }
  修改kibana.yml server.host 將IP綁定至127.0.0.1

2.借用nginx的用戶名密碼機制,配置nginx用戶名密碼進行登錄
修改nginx.conf

     location /{
           auth_basic "elk 賬號密碼認證";
           auth_basic_user_file /Volumes/tool/nginx_auth; # auth_basic_user_file 賬號密碼文件
           proxy_pass  http://127.0.0.1:5601/;  # proxy_pass 地址轉發
     }

添加賬號密碼 htpasswd -cb /Volumes/tool/nginx_auth root root 一定要以這樣的形式添加 否則無效

Kibana圖形展示
首頁區域
1.可設置查看的時間和設置自動刷新時間
2.可以根據時間查看訪問量: 每秒、每分鐘等
3.可以根據某個字段查詢
Kibana圖形有建立
1.線圖的創建,可以保留多個線程
2.餅圖的創建,show label
3.條形圖的創建
Kibana面板的創建
1.創建面板
2.在面板上添加圖形

定時刷新
在這裏插入圖片描述
創建圖形
在這裏插入圖片描述
選擇圖形樣板
在這裏插入圖片描述
選擇索引
在這裏插入圖片描述
Filebeat日誌收集解析

Logstash收集日誌
1.依賴於java環境,用來收集日誌比較重,佔用內存和CPU
2.Filebeat相對輕量,佔用服務器資源小
3.一般選用Filebeat來進行日誌收集
Filebeat -> Elasticsearch ->Kinaba
1.只適合查看日誌
2.不適合具體日誌分析
3.不支持正則,不支持去除字段

Filebeat安裝:官網直接下載包即可

Filebeat發送日誌到Elasticsearch
修改filebeat.yml

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
      - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   

output:
 elasticsearch:
  hosts: ["localhost:9200"]


啓動Filebeat -c指定配置文件
cd 進入filebeat安裝目錄執行命令啓動

 filebeat -e -c filebeat.yml 


Filebeat查看日誌數據方式
GET /filebeat-7.4.1-2019.11.01-000001/_search 創建filebeat-*索引

Filebeat採集多個日誌

修改Filebeat.yml配置

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
     - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   
  fields:
   type: nginx    #日誌區分標識符
  fields_under_root: true
- type: log       #加一個type收集日誌
  tail_file: true  
  backoff: "1s"  
  paths:
     - /Volumes/tool/apache-tomcat-8.5.40/logs/*.log   
  fields:
   type: tomcat    #日誌區分標識符
  fields_under_root: true

output:
 logstash:
  hosts: ["localhost:5044"]

Logstash如何區分日誌並對日誌進行不同的解析
1.Filebeat加入一定字段來進行區分
2.Logstash使用區別字段來區分

修改filebeat-logstash.conf配置文件,通過type字段進行判斷區分多個日誌

input {
 beats{
  port => 5044
 }   
}
filter{
  if[type]=="nginx"{
    json{         
      source=>"message" #因爲nginx是json格式
     }
    }else if[type]=="tomcat"{
     }
}

output {
  if[type]=="nginx"{   #也可以通過type判斷將日誌傳輸到不同的服務器上的Elasticsearch中
    elasticsearch {
    hosts => "localhost:9200"    
    index => "nginx-%{+YYYY.MM.dd}"
    }
  }else if[type]=="tomcat"{
    elasticsearch{
    hosts => "localhost:9200"
    index => "tomcat-%{+YYYY.MM.dd}"   
    }
  }
}

Filebeat+Logstash日誌收集解析

Filebeat和Logstash說明
1.Filebeat: 輕量級,但不支持正則,不支持去除字段,不需要依賴java環境
2.Logstash: 比較重,但支持正則,支持移除字段,需要依賴java環境

搭建架構演示
1.Logstash -> Elasticsearch -> Kinaba
2.Filebeat -> Elasticsearch -> Kinaba
3.Filebeat - > Logstash -> Elasticsearch -> Kinaba

修改Filebeat配置發往Logstash

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
      - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   

output:
  logstash:
   hosts: ["localhost:5044"]

新建一個filebeat-logstash.conf

input {
 beats{
  host =>'0.0.0.0'  #訪問IP限制
  port => 5044   #監聽端口
 }   
}
output {
    elasticsearch {
    hosts => "localhost:9200"    
    }
}

Logstash上移除不必要的字段

remove_field => ["message","@version"]

Filebeat批量部署比Logstash要方便得多
1.Logstash監聽在內網
2.Filebeat發送給內網的Logstash


架構如下

Filebeat(多臺)
Filebeat(多臺) -> Logstash(正則) -> Elasticsearch(入庫) -> Kibana(展現)
Filebeat(多臺)

Filebeat和Logstash間引入Redis

架構存在問題
1.Logstash性能不足
2.擴容Logstash,多臺Filebeat配置可能會不一致

架構優化
Filebeat(多臺)                                Logstash(正則)
Filebeat(多臺) -> Redis , Kafka -> Logstash(正則) -> Elasticsearch -> Kibana
Filebeat(多臺)                                Logstash(正則)
Redis安裝搭建
省略。。。。。。

Filebeat配置寫入Redis
修改Filebeat.yml

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
     - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   
  fields:
   type: nginx    #日誌區分標識符
  fields_under_root: true

output.redis:
  hosts: ["127.0.0.1:6379"]
  db: 2   #存儲的庫
  timeout: 5  #連接超時
  key: "logs"   #存儲數據的key Redis會自動創建

Logstash從Redis中讀取數據
input{
   redis{
     host => "127.0.0.1"
     port => "6379"
     key  => "logs"   #讀取的key
     data_type => "list"  #讀取類型
     db => 2    #讀取的庫
     batch_count => 1     #這個值是指從隊列中讀取數據時,一次性取出多少條。不寫會報錯,解決辦法就是,不使用這個功能,將       batch_size設置爲1

   }
}
output {
  if[type]=="nginx"{   
    elasticsearch {
    hosts => "localhost:9200"    
    index => "nginx-%{+YYYY.MM.dd}"
    }
  }else if[type]=="tomcat"{
    elasticsearch{
    hosts => "localhost:9200"
    index => "tomcat-%{+YYYY.MM.dd}"   
    }
  }
}

啓動redis會發現數據庫中自動創建了key “logs”
在這裏插入圖片描述
啓動Filebeat後,需要nginx添加日誌,Filebeat纔會開始進行連接Redis並插入數據

Filebeat和Logstash間引入Kfaka

Kafka依賴於Zookeeper
1.Kafka安裝:官網下載二進制安裝包
2.Zookeeper安裝:官網下載二進制安裝包 下載bin的包

Zookeeper啓動
1.進入config目錄:cp zoo_sample.cfg zoo.cfg
2.更改配置添加:clientPortAddress=127.0.0.1 監聽IP
2.啓動: zkServer.sh start
注意點:默認使用8080端口

Kafaka啓動
進入bin目錄,啓動:kafka-server-start.sh …/config/server.properties

Filebeat日誌發送到Kafka

filebeat.inputs:
- type: log  
  tail_file: true  
  backoff: "1s"  
  paths:
     - /usr/local/Cellar/nginx/1.17.3_1/logs/*.log   
  fields:
   type: nginx    #日誌區分標識符
  fields_under_root: true

output:
  kafka: 
   hosts: ["127.0.0.1:9092"]
   topic: logs


Logstash讀取Kafka的數據

input{
   kafka{
      bootstrap_servers => "127.0.0.1:9092"
      topics => ["logs"]   #數組類型,可配置多個topic
      group_id => "logs"   #組Id可自定義
      consumer_threads => 5   #消費者線程數
      decorate_events => true      //此屬性會將當前topic、offset、group、partition等信息也帶到message中   
      codec => "json"  
   }
}
output {
  if[type]=="nginx"{   
    elasticsearch {
    hosts => "localhost:9200"    
    index => "nginx-%{+YYYY.MM.dd}"
    }
  }else if[type]=="tomcat"{
    elasticsearch{
    hosts => "localhost:9200"
    index => "tomcat-%{+YYYY.MM.dd}"   
    }
  }
}


Kafka查看隊列信息

1.查看Group: kafka-consumer-groups.sh -bootstrap-server 127.0.0.1:9092 --list
2.查看隊列: kafka-consumer-groups.sh -bootstrap-server 127.0.0.1:9092 -group logs --describe

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