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