1.基本介紹
1.1 什么是分布式日志
在分布式應用中,日志被分散在儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。所以我們使用集中化的日志管理,分布式日志就是對大規模日志數據進行采集、追蹤、處理。
1.2 為什么要使用分布式日志
一般我們需要進行日志分析場景:直接在日志文件中grep、awk就可以獲得自己想要的信息。但在規模較大的場景中,此方法效率低下,面臨問題包括日志量太大如何歸檔、文本搜索太慢怎么辦、如何多維度查詢。需要集中化的日志管理,所有服務器上的日志收集匯總。常見解決思路是建立集中式日志收集系統,將所有節點上的日志統一收集,管理,訪問。
1.3 ELK 分布式日志
- 實際上ELK是三款軟件的簡稱,分別是Elasticsearch、 Logstash、Kibana組成。
- Elasticsearch 基于java,是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
- Kibana 基于nodejs,也是一個開源和免費的工具,Kibana可以為Logstash和ElasticSearch提供的日志分析友好的Web 界面,可以匯總、分析和搜索重要數據日志。
- Logstash 基于java,是一個開源的用于收集,分析和存儲日志的工具。
- 下面是ELK的工作原理:
2.實戰
2.1 搭建elk環境
本環境用于接收各logstash發送的日志數據。
具體,參考:https://core815.blog.csdn.net/article/details/149837061
2.2 準備日志文件
日志文件,可以指向應用系統具體文件目錄,本文準備了測試文件,可在文末“相關資源”章節獲取。
2.3 安裝logstash
安裝文件,放到“/home”路徑下:
tar -zxvf logstash-9.1.2-linux-x86_64.tar.gz
編寫配置文件:
cd /home/logstash-9.1.2/bin
vim logstash-elasticsearch.conf
logstash-elasticsearch.conf:
# INPUT 模塊:定義日志來源
input {file {# 監聽 /home/logs/ 目錄下所有 .log 文件path => "/home/logs/*.log"# 首次啟動時從文件開頭讀取(歷史日志全量導入)start_position => "beginning"# 禁用 sincedb 記錄(每次重啟均重新讀取文件,適用于測試環境)sincedb_path => "/dev/null"# 多行合并編解碼器(用于處理跨行日志,如 Java 異常堆棧)codec => multiline {# 匹配以時間戳開頭的行(格式示例:2025-08-13 10:00:00)pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}"# true 表示不匹配 pattern 的行合并到上一事件negate => true# 將當前行合并到上一事件的末尾what => "previous"# 強制未完成的多行事件每 3 秒輸出一次auto_flush_interval => 3}}
}# FILTER 模塊:數據處理邏輯
filter {# 若文件路徑包含 "info"(如 /home/logs/app_info.log)if [path] =~ "info" {# 標記日志類型為 "info"mutate { replace => { type => "info" } }# 使用 GROK 解析 Apache 組合日志格式(提取 IP、方法、狀態碼等字段)grok {match => { "message" => "%{COMBINEDAPACHELOG}" }}# 解析日志中的時間戳,覆蓋默認的 @timestampdate {match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] # 格式示例:13/Aug/2025:14:00:00 +0800}}# 若文件路徑包含 "error"(如 /home/logs/error.log)else if [path] =~ "error" {# 標記日志類型為 "error"mutate { replace => { type => "error" } }}# 其他日志文件else {# 標記日志類型為 "random_logs"mutate { replace => { type => "random_logs" } }}
}# OUTPUT 模塊:定義數據輸出目標
output {# 輸出到 Elasticsearchelasticsearch {hosts => "10.86.97.210:9200" # ES 服務器地址(生產環境建議改為數組格式:["ip:port"])user => "elastic" # 用戶名(正確字段應為 username)password => "test@123456" # 密碼(特殊符號需用雙引號包裹)# 缺失參數建議添加:# ssl => true # 若 ES 啟用 HTTPS 需開啟# index => "logs-%{type}-%{+YYYY.MM.dd}" # 按類型和日期分隔索引}# 同時輸出到控制臺(調試用,生產環境可移除)stdout {codec => rubydebug # 以易讀格式打印結構化事件}
}
創建logstash專用用戶:
sudo groupadd -r logstash
sudo useradd -r -s /bin/bash -g logstash -d /home/logstash-9.1.2 -m logstash
調整logstash目錄權限:
# 將 Logstash 安裝目錄所有權賦予新用戶
sudo chown -R logstash:logstash /home/logstash-9.1.2/
# 確保日志目錄可寫入
sudo mkdir /var/log/logstash
sudo chown logstash:logstash /var/log/logstash
使用測試命令檢查語法:
sudo -u logstash /home/logstash-9.1.2/bin/logstash -f /home/logstash-9.1.2/bin/logstash-elasticsearch.conf --config.test_and_exit
以專用用戶身份啟動:
sudo -u logstash /home/logstash-9.1.2/bin/logstash -f /home/logstash-9.1.2/bin/logstash-elasticsearch.conf
啟動效果:
2.4 kibana查看
kibana訪問地址:
http://10.86.97.210:5601/
賬號:elastic
密碼:test@123456
3.相關資源
百度網盤:https://pan.baidu.com/s/1DFlQim7xPwx7uEKOGTd85A?pwd=4i76