背景:在開發調試階段,發現bug後開始在服務器上查找日誌,但是這個過程真的好痛苦.
一種方式是直接在服務器上tail -f 或者tail -n 直接查看,但是日誌太多,不容易發現問題
另一種方式導出最近的日誌到本地,打開本地編輯器一點一點查看
但是兩種方式都很麻煩,有沒有輕鬆一點的方法呢?
在這個開源的時代,一直聽說elk架構,那就搭建這個日誌系統,感受下這個系統的魅力吧
基本服務介紹
什麼是elasticsearch
Elasticsearch 是一個分佈式可擴展的實時搜索和分析引擎, 一切設計都是爲了提高搜索的性能
1. 分佈式實時文件存儲,並將每一個字段都編入索引,使其可以被搜索。
2. 實時分析的分佈式搜索引擎。
3. 可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。
什麼是Filebeat
go語言開發的,一個輕量級的日誌收集的工具,消耗更少的cpu 和 內存。
什麼是Logstash
Logstash 是一個輕量級、開源的服務器端數據處理管道,允許您從各種來源收集數據,進行動態轉換,並將數據發送到您希望的目標
但是logstash java開發,依賴jvm,相對filebeat還是比較消耗服務器資源
主要工作過程是是 input->filter->output
獲取輸入, 過濾解析, 重新輸出,配置比較簡單
什麼是Kibana
Kibana 是一款開源的數據分析和可視化平臺,它是 Elastic Stack 成員之一,設計用於和 Elasticsearch 協作。
可以使用 Kibana 對 Elasticsearch 索引中的數據進行搜索、查看、交互操作。
可以很方便的利用圖表、表格及地圖對數據進行多元化的分析和呈現。
怎麼使用?
因爲logstash服務比較重,所以我們主要是通過filebeat來採集日誌信息,都交給logstash,通過logstash過濾輸出到elasticsearch中.
建議的服務搭建
1. 獨立的es集羣
2. 每個服務器上安裝filebeat進行日誌採集
3. 單獨的logstash服務,來接收filebeat日誌,過濾並輸出到es中
4. 單獨的kibana服務,來做數據段web頁面展示
來貼張常用的架構圖
安裝服務
官網 https://www.elastic.co/cn/downloads/
首先我選擇安裝目錄爲
mkdir -p /usr/local/elk
0 服務器先安裝 jdk環境, 版本jdk8 以上
推薦yum安裝
1 下載安裝 elasticsearch
下載elasticsearch 下載安裝包,並解壓
cd /usr/local/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.0-linux-x86_64.tar.gz
tar xvf elasticsearch-7.6.0-linux-x86_64.tar.gz
使用默認配置,啓動服務
cd /usr/local/elk/elasticsearch-7.6.0/bin
./elasticsearch -d
好吧,出師不利,剛啓動遇到第一個問題,elasticsearch不允許root用戶啓動(後面幾個服務也是不允許),所以我先創建elstic用戶和組,並設置elk目錄屬於elstic用戶組
錯誤顯示爲
java.lang.RuntimeException: can not run elasticsearch as root
解決方式
創建elastic用戶
adduser elastic
設置密碼
passwd elastic
修改目錄權限
chown -R elstic /etc/usr/elk
切換用戶
su elastic
然後成功啓動
可以訪問elsticsearch接口試下
2下載安裝啓動kibana
下載並解壓
cd /usr/local/elk/
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.6.0-linux-x86_64.tar.gz
tar xvf kibana-7.6.0-linux-x86_64.tar.gz
修改配置,使其能夠外網訪問,並且配置爲中文版
vim /usr/local/elk/kibana-7.6.0-linux-x86_64/config/kibana.xml
修改1. 改爲外網可訪問形式(不建議,最好限制ip)
server.host: "0.0.0.0"
修改2. 最後一行增加
i18n.locale: "zh-CN"
注意:服務器上要開放外網訪問端口,默認爲 5601
然後瀏覽器訪問 外網ip:5601,很開心進入管理頁面,並且是中文版呦
3 下載安裝 filebeat
cd /usr/local/elk/
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.0-linux-x86_64.tar.gz
tar xvf filebeat-7.6.0-linux-x86_64.tar.gz
這裏我們重點講下filebeat的配置
通用設計是 filebeat讀取日誌,輸出到logstash,經過logstash解析後,輸出到 elasticsearch
問題1.增麼配置filebeat讀取日誌呢?
我們打開filebeat.xml,進行如下配置
# filebeat 輸入標識
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
# 定義輸入類型,爲日誌類型
- type: log
# Change to true to enable this input configuration.
# 開啓配置
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
# 讀取日誌文件羅京
paths:
- /data/logs/cheetahcafe_server/test/info.log
- # 增加自定義字段
fields:
log_name: cheetahcafe-test
tail_files: true
#- c:\programdata\elasticsearch\logs\*
- type: log
enabled: true
paths:
- /data/logs/cheetahcafe_server/dev/info.log
fields:
log_name: cheetahcafe-dev
tail_files: true
# Exclude lines. A list of regular expressions to match. It drops the lines that are
# matching any regular expression from the list.
#exclude_lines: ['^DBG']
上面配置可以看到,我們配置了多個日誌輸入,如果有多個服務日誌需要監控的化,可以採用上面這種配置,並且設置 fields字段,進行區分
問題2 怎麼輸出到 logstash中?
默認配置文件很給力,都有示例,太好用了
同樣我們還是打開配置文件,進行如下配置,
1 註釋 output elasticsearch ,默認的是這種形式,但是我們不採用,先註釋掉
#output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
# Protocol - either `http` (default) or `https`.
#protocol: "https"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
#username: "elastic"
#password: "changeme"
開啓logstash配置,配置中有註釋說明哦,非常簡單
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
# Logstash 主機地址,我們默認本機的5044端口
hosts: ["localhost:5044"]
# Optional SSL. By default is off. 開啓ssl
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
配置後可以進行啓動filebeat
cd /usr/local/elk/filebeat-7.6.0-linux-x86_64
nohup ./filebeat -c filebeat.yml &
4 下載安裝 logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.0.tar.gz
tar xvf logstash-7.6.0.tar.gz
我們同樣要考慮下面兩個問題來進行配置
1.我們怎麼讀取日誌輸入?
通過filebeat把日誌輸入到logstash中,我們打開配置文件,進行下面配置
cd /usr/local/elk/logstash-7.6.0/config
cp logstash-sample.conf logstash.conf
vim logstash.conf
配置日誌輸入,beats配置
input {
beats {
# beats的端口號
port => 5044
# 是否開啓ssl加密,否
ssl => false
}
}
2.我們輸出到哪裏?
我們日誌輸出到elasticsearch中,上面說到此時有兩個filebeats輸入,我們怎麼進行區分呢?
此時 filebeats中的fields字段此時就有很大用處了
輸出配置,輸出到elasticsearch中
output {
elasticsearch {
# es的服務和端口
hosts => ["http://localhost:9200"]
# 輸出到es中索引的創建格式,此時注意 {[fields][log_name]} ,這裏使用了filebeats中配置的自定義屬性進行區分索引
index => "%{[fields][log_name]}-%{+YYYY.MM.dd}"
#index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
這樣我們很輕鬆就配置好了 logstash,下面進行啓動服務
cd /usr/local/elk/logstash-7.6.0/bin
nohup ./logstash -f ../config/logstash-es.conf &
通過上面操作,我們就成功配置和啓動我們的elk日誌系統了
下面開心的到kibana中使用下吧
使用kibana
最後一步,我們來看下怎麼使用吧? 瀏覽器訪問 ip+端口,打開面板
創建索引模式
首先 我們先創建個索引模式,爲了能夠簡單對統一索引進行合併展示
點擊 管理 -> 索引模式,然後創建索引模式
因爲我們的索引是根據項目並且按天進行創建的,所以可以按照項目名來創建索引模式就行了, 很簡單…
查看日誌信息
創建好索引模式,我們就可以在 側邊欄的 “發現” 中找到想要查看的數據了, 默認查看的字段比較多,但是基本都是我們不關係的,
可以在可用字段中選擇 message,只展示時間和message 就可以了,下面是展示效果
總結
回顧整體流程
1 使用filebeat採集數據,輸出到logstash中
2 logstash 接收filebeat的日誌,輸出到elasticsearch中
3 kibana 連接了elasticsearch, 能夠展示索引數據,並做些數據彙總,展示,篩選的操作
感受到的不足
1 logstash 只對日誌的接收和輸出做了處理,沒有使用filter進行日誌篩選和結構化處理,
所以查看日誌的時候,是通過message的字段,整體查看的
2 kibana沒有增加權限校驗,直接對外開放比較危險, 可以簡單處理,增加對訪問的ip限制
比如 只允許內網訪問 等
遇到的問題
- elasticsearch服務和logstash服務不能用root用戶啓動
解決方式:創建個其它用戶,使用其它用戶啓動