一、簡(jiǎn)介
1.1 Elasticsearch、Logstash 和 Kibana 簡(jiǎn)介
Elasticsearch、Logstash 和 Kibana 組成了一個(gè)開(kāi)源的日志分析系統(tǒng)簡(jiǎn)稱 ELK Stack。
- Elasticsearch: 一個(gè)基于 Lucene 的搜索引擎,可以快速存儲(chǔ)、檢索和分析大量數(shù)據(jù)
- Logstash: 一個(gè)日志收集和處理工具,可以將來(lái)自不同來(lái)源的數(shù)據(jù)收集到 Elasticsearch 中
- Kibana: 一個(gè)數(shù)據(jù)可視化平臺(tái),可以實(shí)時(shí)地展示 Elasticsearch 存儲(chǔ)的數(shù)據(jù)
1.2 日志分析系統(tǒng)的意義
在現(xiàn)代化的信息系統(tǒng)中需要收集、存儲(chǔ)和分析龐大的日志數(shù)據(jù),以便更好地理解系統(tǒng)的運(yùn)行狀態(tài)和診斷問(wèn)題。而使用傳統(tǒng)的方法如 grep、tail 和 awk 來(lái)分析日志數(shù)據(jù),很容易出錯(cuò)并且不夠靈活。通過(guò)使用 ELK Stack可以更快捷、更準(zhǔn)確地進(jìn)行日志分析和數(shù)據(jù)可視化,從而提高信息系統(tǒng)的穩(wěn)定性和可靠性。
二、日志分析系統(tǒng)技術(shù)架構(gòu)
本文主要介紹日志分析系統(tǒng)的技術(shù)架構(gòu),包括Logstash、Elasticsearch和Kibana三部分。
2.1 Logstash
Logstash是一個(gè)開(kāi)源數(shù)據(jù)收集引擎。它能夠動(dòng)態(tài)地從不同的來(lái)源(如文件、網(wǎng)絡(luò)流、系統(tǒng)日志等)收集數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行過(guò)濾、轉(zhuǎn)換和輸出。在Logstash中,輸入、過(guò)濾器和輸出是三個(gè)重要的模塊。
- 輸入模塊:負(fù)責(zé)從各種來(lái)源收集數(shù)據(jù)。
- 過(guò)濾器模塊:對(duì)輸入數(shù)據(jù)進(jìn)行過(guò)濾、轉(zhuǎn)換和格式化等操作,使其變得易于搜索和分析。
- 輸出模塊:將處理過(guò)后的數(shù)據(jù)輸出至指定的位置,如Elasticsearch、TCP和STDOUT等。
下面是一個(gè)使用Java編寫(xiě)的Logstash配置文件示例,其中包含從文件讀取數(shù)據(jù)、利用grok正則表達(dá)式過(guò)濾數(shù)據(jù)并輸出到Elasticsearch的案例
input{
file{
path => "/usr/share/logstash/sample.log" //文件路徑
start_position => "beginning" //從頭開(kāi)始讀取
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" } //使用grok正則表達(dá)式過(guò)濾數(shù)據(jù)
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] //解析時(shí)間戳
}
}
output {
elasticsearch {
hosts => ["localhost:9200"] //指定Elasticsearch的地址
index => "logstash-%{+YYYY.MM.dd}" //動(dòng)態(tài)創(chuàng)建索引
}
}
2.2 Elasticsearch
Elasticsearch是一個(gè)分布式、RESTful風(fēng)格的搜索和分析引擎。它可以幫助用戶存儲(chǔ)、搜索、分析和可視化大量的數(shù)據(jù)。
Elasticsearch的核心概念是索引、文檔和節(jié)點(diǎn)
- 索引:類似于數(shù)據(jù)庫(kù)中的表格,用于保存某種類型的文檔。
- 文檔:實(shí)際存儲(chǔ)的數(shù)據(jù)單元。每個(gè)文檔都必須屬于一個(gè)索引,并且具有唯一標(biāo)識(shí)符。
- 節(jié)點(diǎn):存儲(chǔ)和處理數(shù)據(jù)的服務(wù)器實(shí)例。
下面是一個(gè)Java編寫(xiě)的Elasticsearch配置文件示例,包含索引的設(shè)置、分片和副本的設(shè)置以及相應(yīng)的mappings和settings等配置:
PUT /my-index //創(chuàng)建索引
{
"settings": {
"number_of_shards": 2, //設(shè)置分片數(shù)量
"number_of_replicas": 1 //設(shè)置副本數(shù)量
},
"mappings": { //設(shè)置mappings
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"create_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
2.3 Kibana
Kibana是一個(gè)基于Elasticsearch的開(kāi)源分析和可視化平臺(tái)。它提供了各種數(shù)據(jù)探索、查詢和可視化功能,使用戶能夠更好地理解和分析自己的數(shù)據(jù)。
Kibana主要有如下幾個(gè)功能:
- 可視化展示:通過(guò)多種可視化方式(如柱狀圖、餅圖、地圖等)展示數(shù)據(jù)
- 查詢和過(guò)濾:Kibana支持使用Lucene查詢語(yǔ)句進(jìn)行全文搜索和過(guò)濾操作
- Dashboard:可以創(chuàng)建個(gè)性化的Dashboard,并將多個(gè)可視化組件組合在一起展示
下面是一個(gè)使用Java編寫(xiě)的Kibana配置文件示例,其中包含應(yīng)用程序、查詢和可視化的配置:
POST my-index/_search //查詢
{
"query": {
"match": {
"content": "some words"
}
}
}
PUT /my-dashboard //創(chuàng)建Dashboard
{
"title": "My Dashboard",
"panelsJSON": "[..., ...]" //設(shè)置可視化組件
}
總的來(lái)說(shuō)Logstash+Elasticsearch+Kibana的架構(gòu)可以幫助我們搭建一個(gè)完整的日志分析系統(tǒng),方便我們快速分析所需的數(shù)據(jù),并對(duì)其進(jìn)行合理的可視化展示和查詢操作
三、環(huán)境搭建
3.1 下載安裝 Elasticsearch Logstash Kibana
Elasticsearch Logstash Kibana 是三個(gè)不同的工具需要分別下載并安裝
3.1.1 Elasticsearch
Elasticsearch是一個(gè)開(kāi)源搜索引擎它的功能包括全文檢索、結(jié)構(gòu)化搜索、分布式搜索、分析 可以從官網(wǎng)下載最新版本的Elasticsearch
3.1.2 Logstash
Logstash是一個(gè)開(kāi)源的數(shù)據(jù)處理工具,通常用于日志收集、過(guò)濾、格式化和轉(zhuǎn)發(fā) 可以從官網(wǎng)下載最新版本的Logstash
3.1.3 Kibana
Kibana是一個(gè)開(kāi)源的數(shù)據(jù)可視化工具,它可以將存儲(chǔ)在Elasticsearch中的數(shù)據(jù)進(jìn)行可視化展示可以從官網(wǎng)下載最新版本的Kibana
3.2 啟動(dòng) Elasticsearch Logstash Kibana
在完成安裝后需要啟動(dòng)三個(gè)工具
3.2.1 Elasticsearch
在Linux系統(tǒng)下可以通過(guò)以下命令啟動(dòng)Elasticsearch:
$ cd elasticsearch-x.x.x/bin/
$ ./elasticsearch
在Windows系統(tǒng)下可以通過(guò)運(yùn)行bin/elasticsearch.bat文件啟動(dòng)Elasticsearch
3.2.2 Logstash
在Linux系統(tǒng)下可以通過(guò)以下命令啟動(dòng)Logstash:
$ cd logstash-x.x.x/bin/
$ ./logstash -f /path/to/config.conf
在Windows系統(tǒng)下可以通過(guò)運(yùn)行bin/logstash.bat文件啟動(dòng)Logstash
3.2.3 Kibana
在Linux系統(tǒng)下可以通過(guò)以下命令啟動(dòng)Kibana:
$ cd kibana-x.x.x/bin/
$ ./kibana
在Windows系統(tǒng)下可以通過(guò)運(yùn)行bin/kibana.bat文件啟動(dòng)Kibana
3.3 進(jìn)行基礎(chǔ)配置
在啟動(dòng)三個(gè)工具后需要進(jìn)行一些基礎(chǔ)的配置以便這些工具能夠正常工作
具體的配置方法可以參考各自的官方文檔。通常需要進(jìn)行的配置包括Elasticsearch的集群配置、Logstash的Pipeline配置和Kibana的索引配置等
四、實(shí)現(xiàn)步驟
4.1 輸入數(shù)據(jù)源
輸入數(shù)據(jù)源可以是各種系統(tǒng)生成的日志文件例如 Apache、Nginx 的訪問(wèn)日志,應(yīng)用程序的運(yùn)行日志等??梢酝ㄟ^(guò)配置文件等方式將日志文件發(fā)送到 Logstash 進(jìn)行處理。
4.2 編寫(xiě) Logstash 配置文件 過(guò)濾 輸出數(shù)據(jù)到 Elasticsearch 中
以下是示例代碼:
input {
// 指定輸入源,這里假設(shè)使用的是 filebeat
beats {
port => "5044"
type => "logs"
}
}
filter {
// 通過(guò)正則表達(dá)式進(jìn)行過(guò)濾,提取所需信息
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
// 時(shí)間格式化,將默認(rèn)格式轉(zhuǎn)換為 ISO 標(biāo)準(zhǔn)格式
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
// 輸出到 Elasticsearch 指定索引中
elasticsearch {
hosts => ["localhost:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
}
在 Logstash 的配置文件中需要指定輸入源(如上述代碼中的 beats
),就是從哪個(gè)通道讀取數(shù)據(jù)。然后使用 filter
對(duì)數(shù)據(jù)進(jìn)行過(guò)濾和處理,比如使用正則表達(dá)式對(duì)日志進(jìn)行格式化。最后使用 output
將數(shù)據(jù)輸出到 Elasticsearch 指定的索引中。
4.3 在 Kibana 中創(chuàng)建索引并進(jìn)行可視化展示
在看到數(shù)據(jù)實(shí)時(shí)輸出到 Elasticsearch 中就可以在 Kibana 中對(duì)數(shù)據(jù)進(jìn)行可視化處理了。首先需要在 Kibana 中創(chuàng)建索引以便展示至頁(yè)面上。然后可以使用多種圖表、面板等方式對(duì)數(shù)據(jù)進(jìn)行分析、呈現(xiàn)和展示,例如使用柱狀圖展示日志訪問(wèn)量 TopN、使用儀表盤(pán)展示系統(tǒng)運(yùn)行狀態(tài)等。Kibana 的可視化方式非常靈活,完全可以根據(jù)不同的應(yīng)用場(chǎng)景做出定制化的展示效果。
五、常用操作
5.1 重啟 關(guān)閉 啟動(dòng): Elasticsearch Logstash Kibana
Elasticsearch
// 停止 Elasticsearch
service elasticsearch stop
// 啟動(dòng) Elasticsearch
service elasticsearch start
// 重啟 Elasticsearch
service elasticsearch restart
Logstash
// 停止 Logstash
service logstash stop
// 啟動(dòng) Logstash
service logstash start
// 重啟 Logstash
service logstash restart
Kibana
// 停止 Kibana
service kibana stop
// 啟動(dòng) Kibana
service kibana start
// 重啟 Kibana
service kibana restart
5.2 Logstash 配置文件優(yōu)化
為了提高 Logstash 的性能可以進(jìn)行如下配置文件優(yōu)化:
- 盡量使用過(guò)濾器插件中的 grok 插件,避免使用 ruby 插件。
- 避免在條件語(yǔ)句中使用復(fù)雜表達(dá)式。
- 避免使用 if 濾鏡,使用 drop 來(lái)代替。
- 避免使用 date filter 插件來(lái)解析時(shí)間戳,直接使用 elasticsearch 的時(shí)間戳字段即可。
5.3 Elasticsearch 性能優(yōu)化
要想提高 Elasticsearch 的性能可以進(jìn)行如下優(yōu)化:
- 提高數(shù)據(jù)寫(xiě)入速度:合理設(shè)置 shard、削減文檔個(gè)數(shù)、利用 bulk API 批量插入等方法。
- 提高數(shù)據(jù)讀取速度:合理設(shè)置副本數(shù)量、利用 cache 提高查詢效率、合理利用分片等方法。
- 如有需要,可以將 Elasticsearch 的數(shù)據(jù)目錄移動(dòng)到一個(gè)快速的存儲(chǔ)設(shè)備上。
5.4 Kibana 圖表優(yōu)化
- 避免在畫(huà)布等可視化組件中展示過(guò)多數(shù)據(jù)。
- 利用 Elasticsearch 中已有的聚合函數(shù),減少 Kibana 中的聚合計(jì)算工作量。
- 對(duì)于一些復(fù)雜的可視化需求,可以通過(guò)自定義插件來(lái)滿足。
六、實(shí)踐案例
6.1 使用 ELK 收集服務(wù)器日志并分析
ELK 是一款用于收集、存儲(chǔ)、搜索和可視化日志的開(kāi)源平臺(tái),它由 Elasticsearch、Logstash 和 Kibana 三個(gè)開(kāi)源項(xiàng)目組成
以下是使用 ELK 收集服務(wù)器日志并分析的具體步驟:
- 在服務(wù)器上安裝 Logstash,并配置好輸入、過(guò)濾器和輸出。輸入模塊可以使用文件輸入或者其他支持的協(xié)議輸入,過(guò)濾器模塊可以用于對(duì)數(shù)據(jù)進(jìn)行處理和轉(zhuǎn)換,輸出模塊可以將數(shù)據(jù)導(dǎo)出到 Elasticsearch 索引中。
input {
file {
path => "/var/log/messages"
codec => plain {
charset => "ISO-8859-1"
}
}
}
filter {
json {
source => "message"
}
date {
match => [ "timestamp", "ISO8601" ]
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "myserver-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
- 啟動(dòng) Logstash 并檢查是否正常運(yùn)行。
bin/logstash -f /path/to/config.conf --config.reload.automatic
- 在 Elasticsearch 上查詢和分析日志數(shù)據(jù)??梢允褂?Kibana 來(lái)可視化數(shù)據(jù)和構(gòu)建儀表盤(pán)。例如,可以使用 Kibana 顯示最新的日志、錯(cuò)誤率或者其他關(guān)鍵指標(biāo)。
以上是一個(gè)簡(jiǎn)要的 ELK 收集服務(wù)器日志并分析的流程,具體實(shí)現(xiàn)要根據(jù)不同場(chǎng)景進(jìn)行調(diào)整。
6.2 搭建遠(yuǎn)程日志系統(tǒng)并實(shí)時(shí)監(jiān)控
可以使用 Rsyslog 或者其他日志采集器來(lái)輕松地將日志推送到 ELK 應(yīng)用程序。以下是一些構(gòu)建遠(yuǎn)程日志系統(tǒng)的步驟:
- 在遠(yuǎn)程服務(wù)器上安裝 Rsyslog,并配置好輸入和輸出。輸入模塊可以使用文件輸入或者其他支持的協(xié)議輸入,例如 TCP、UDP、TLS 等。輸出模塊可以將數(shù)據(jù)導(dǎo)出到 Elasticsearch 索引中
module(load="imfile")
input(type="imfile"
File="/var/log/syslog"
Tag="system"
severity="warning"
Facility="local0")
action(type="omelasticsearch"
template="json"
searchIndex="syslog-%Y.%m.%d"
dynSearchIndex="on"
servers="127.0.0.1:9200")
- 在 Elasticsearch 中創(chuàng)建索引,并設(shè)置相關(guān)的映射規(guī)則??梢允褂?curl 命令或者 Kibana DevTools 來(lái)完成此操作。
curl -X PUT "localhost:9200/syslog-2023.05.30" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"hostname": {
"type": "keyword"
},
"message": {
"type": "text"
},
"program": {
"type": "keyword"
},
"priority": {
"type": "keyword"
},
"severity": {
"type": "keyword"
}
}
}
}
'
- 啟動(dòng) Rsyslog 并檢查是否正常運(yùn)行可以使用以下命令測(cè)試是否能夠?qū)⑷罩就扑偷?Elasticsearch 中
logger -t system -p local0.warning "this is a test message"
curl http://localhost:9200/syslog-2023.05.30/_search?pretty
- 在 Kibana 中創(chuàng)建 Dashboard 和可視化圖表,用于實(shí)時(shí)監(jiān)控和分析日志數(shù)據(jù)
以上是一個(gè)簡(jiǎn)單的搭建遠(yuǎn)程日志系統(tǒng)并實(shí)時(shí)監(jiān)控的流程,具體實(shí)現(xiàn)要根據(jù)不同場(chǎng)景進(jìn)行調(diào)整。
七、注意事項(xiàng)和常見(jiàn)問(wèn)題
7.1 數(shù)據(jù)去重處理
為了避免數(shù)據(jù)在Elasticsearch中出現(xiàn)重復(fù)可以使用Logstash中的aggregate
插件。該插件可以將經(jīng)過(guò)特定字段排序后,相同字段值的事件合并為一個(gè)。由于處理過(guò)程中需要在內(nèi)存中保存數(shù)據(jù),所以需要根據(jù)實(shí)際情況調(diào)整max_map_size
和timeout
參數(shù)避免意外的內(nèi)存溢出。
示例代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-479028.html
input {
file {
path => "/log/path"
start_position => "beginning"
}
}
filter {
# 針對(duì)某個(gè)字段進(jìn)行排序
aggregate {
task_id => "%{task_id}" # 字段名
code => "
map['message'] ||= []
map['message'].push(event.get('message')) # 收集字段值
event.cancel() # 取消本行日志的索引
"
push_map_as_event_on_timeout => true # 所有事件被組合為一個(gè)事件,放到Logstash的輸出隊(duì)列
timeout_task_id_field => "task_id"
timeout => 3 # 等待時(shí)間,單位秒
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
}
7.2 避免 Elasticsearch 執(zhí)行占用過(guò)多磁盤(pán)空間
優(yōu)先使用批量API操作
Elasticsearch提供了批量API操作來(lái)提升性能。減少單個(gè)文檔的請(qǐng)求次數(shù)可以降低網(wǎng)絡(luò)開(kāi)銷,并減少Elasticsearch節(jié)點(diǎn)中內(nèi)存的使用量。
關(guān)閉自動(dòng)建立索引
默認(rèn)情況下Elasticsearch會(huì)自動(dòng)為每個(gè)新索引分配一個(gè)主分片和一個(gè)副本。這個(gè)操作通常非常耗費(fèi)時(shí)間,磁盤(pán)空間和節(jié)點(diǎn)資源。所以當(dāng)需要大量數(shù)據(jù)導(dǎo)入Elasticsearch時(shí),建議關(guān)閉該功能,先導(dǎo)入數(shù)據(jù)后再手動(dòng)建立索引。
設(shè)置方法:在elasticsearch.yml
文件中增加以下內(nèi)容
action.auto_create_index: false
7.3 Logstash 過(guò)濾器正則表達(dá)式語(yǔ)法錯(cuò)誤導(dǎo)致的故障
在使用正則表達(dá)式時(shí)假如表達(dá)式存在語(yǔ)法錯(cuò)誤,則過(guò)濾器將被卡住,不再適用于任何日志。這可能會(huì)導(dǎo)致Logstash停止收集而無(wú)法將日志發(fā)送到Elasticsearch中。在寫(xiě)正則表達(dá)式時(shí)建議先使用在線正則表達(dá)式工具進(jìn)行測(cè)試。另外還可以在Logstash啟動(dòng)前運(yùn)行一個(gè)自動(dòng)化的正則表達(dá)式測(cè)試過(guò)程,以確保配置文件的完整性。
示例代碼:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
if "_grokparsefailure" in [tags] {
drop { } # 發(fā)現(xiàn)Grok失敗時(shí),該事件會(huì)被地毯式丟棄
}
}
7.4 日志數(shù)據(jù)丟失問(wèn)題
應(yīng)用程序級(jí)別的數(shù)據(jù)丟失
應(yīng)用程序在給Logstash發(fā)送日志時(shí)很可能發(fā)生數(shù)據(jù)丟失。對(duì)于這種情況建議首先排除網(wǎng)絡(luò)故障的可能性,并檢查發(fā)送端和接收端之間的所有設(shè)備。
Logstash級(jí)別的數(shù)據(jù)丟失
如果經(jīng)過(guò)排除后數(shù)據(jù)仍然丟失,則可能是由于Logstash無(wú)法處理大量數(shù)據(jù)而導(dǎo)致的,建議將日志文件劃分為使用相同過(guò)濾器預(yù)處理的較小塊。另一個(gè)常見(jiàn)的解決方案是增加Elasticsearch節(jié)點(diǎn)來(lái)容納更多數(shù)據(jù),或者升級(jí)硬件配置以提高性能。
以上方式均無(wú)效考慮采用kafka等高并發(fā)系統(tǒng)進(jìn)行數(shù)據(jù)緩沖,以及定時(shí)備份進(jìn)行數(shù)據(jù)恢復(fù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-479028.html
示例代碼:
input {
# 從Kafka主題my_topic中讀取數(shù)據(jù),該主題包含了在其他數(shù)據(jù)輸入源中收集的數(shù)據(jù)
kafka {
bootstrap_servers => "localhost:9092"
topics => ["my_topic"]
client_id => "my_id"
group_id => "logstash"
auto_commit_interval_ms => 1000
codec => json_lines
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
}
到了這里,關(guān)于Elasticsearch + Logstash + Kibana 日志分析系統(tǒng)搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!