安裝部署logstash 7.10.0詳細教程
- 一、下載并安裝
- 二、新建配置文件
- 三、賦權文件權限
- 四、檢測文件grok語法是否異常
- 五、啟動服務
- 六、安裝啟動常見問題
【背景】
- 整個elk安裝是基于ubuntu 22.04和jdk 11環境。
- logstash采用 *.deb方式安裝,需要服務器能聯網。
- ubuntu 22.04 安裝部署elk(elasticsearch/logstash/kibana) 7.10.0詳細教程
一、下載并安裝
# 下載安裝包命令
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.0-amd64.deb
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.0-amd64.deb.sha512
# 開始安裝
shasum -a 512 -c logstash-7.10.0-amd64.deb.sha512
# 校驗成功出現 logstash-7.10.0-amd64.deb: OK
sudo dpkg -i logstash-7.10.0-amd64.deb
二、新建配置文件
命令:sudo vim /etc/logstash/conf.d/java_service_logs.conf
# java_service_logs.conf 內容詳情如下
input {file {# 要監控的日志文件路徑(支持通配符,匹配兩個目錄下的所有.log文件)path => ["/data/logs/java-admin/*.log","/data/logs/java-api/*.log"]# 日志讀取起始位置:# - beginning:從文件開頭開始讀取(適合首次采集)# - end:從文件末尾開始讀取(默認值,只采集新增內容)start_position => "beginning"# 自定義 sincedb 文件路徑(記錄文件讀取進度,避免重復采集)# 默認路徑在用戶家目錄,這里顯式指定到 Logstash 數據目錄sincedb_path => "/usr/share/logstash/data/java_service_logs_sincedb"# 忽略 15 天前修改的文件(自動清理舊日志文件)ignore_older => "15d" # ===== 多行日志合并配置 =====codec => multiline {# 正則匹配行首的時間戳格式(示例:[2023-10-01T12:34:56,789])pattern => "^\[%{TIMESTAMP_ISO8601}\]"# 匹配邏輯取反:當行不匹配時間戳模式時觸發合并negate => true# 合并方向:將不匹配的行合并到前一行(適合 Java 異常堆棧等場景)what => "previous"# 最大合并行數限制(防止單條日志過大)max_lines => 500 # 自動刷新間隔(秒):超過該時間未匹配到新行則強制提交當前合并結果auto_flush_interval => 3 }# ===== 以下為可選調試參數(當前被注釋) =====# sincedb_path => "/dev/null" # 測試時禁用 sincedb(每次重新讀取全部內容)# ignore_older => 0 # 不忽略舊文件(需配合 start_position 使用)# stat_interval => 10 # 文件狀態檢查間隔(秒,默認1s)# discover_interval => 60 # 新文件發現間隔(秒,默認15s)}
}filter {# ===== 日志結構化解析 =====grok {match => {# 定義兩種匹配模式(支持含/不含堆棧跟蹤的日志)"message" => [# 模式1:包含堆棧跟蹤的日志(如異常日志)"\[%{TIMESTAMP_ISO8601:log_timestamp}\]\s+\[%{DATA:log_thread}\]\s+\[%{LOGLEVEL:log_level}\]\s+%{DATA:log_class}\s+-\s+%{GREEDYDATA:log_message}\n%{GREEDYDATA:stack_trace}",# 模式2:普通日志(無堆棧跟蹤)"\[%{TIMESTAMP_ISO8601:log_timestamp}\]\s+\[%{DATA:log_thread}\]\s+\[%{LOGLEVEL:log_level}\]\s+%{DATA:log_class}\s+-\s+%{GREEDYDATA:log_message}"]}# 用解析后的結構化字段覆蓋原始 message 字段overwrite => ["message"]}# ===== 時間戳處理 =====date {# 將 log_timestamp 字段轉換為 Logstash 時間戳(@timestamp)match => ["log_timestamp", "yyyy-MM-dd HH:mm:ss.SSS"]# 指定轉換后的目標字段(默認會覆蓋 @timestamp)target => "@timestamp"# 時區配置:將原始時間轉換為印度時區(GMT+05:30)# 示例:原始時間 2025-06-01 18:30:00 → 轉換后 @timestamp 為 2025-06-01 13:00:00(UTC時間)timezone => "Asia/Kolkata" }# ===== 堆棧跟蹤處理 =====# 僅當存在 stack_trace 字段時執行if [stack_trace] {mutate {# 將堆棧跟蹤中的換行符 \n 替換為轉義字符 \\n# 避免 Elasticsearch 存儲時丟失換行格式gsub => ["stack_trace", "\n", "\\n"]}}
}output {# ===== Elasticsearch 輸出 =====elasticsearch {# ES 服務器地址(HTTP 協議)hosts => ["http://localhost:9200"]# 索引命名規則:按日期滾動(java_service_logs-2025.04.26)index => "java_service_logs-%{+YYYY.MM.dd}"# 認證信息(Basic Auth)user => "elastic"password => "密碼"}# ===== 調試輸出(注釋狀態)=====# stdout { codec => rubydebug } # 以 Ruby 格式輸出到控制臺(開發調試用)
}
三、賦權文件權限
# 因新建文件權限可能是root賬號的,所以需要授權
sudo chown -R logstash:logstash /etc/logstash/conf.d/*.conf
四、檢測文件grok語法是否異常
# 啟動前檢查下文件中是否有語法錯誤,能更快排錯
sudo /usr/share/logstash/bin/logstash -t -f /elc/logstash/conf.d/java_service_logs.conf
五、啟動服務
sudo systemctl daemon-reload
sudo systemctl start logstash
sudo systemctl stop logstash
sudo systemctl restart logstash
sudo systemctl status logstash
六、安裝啟動常見問題
(1) 查看日志 sudo tail -100f /var/log/logstash/logstash-plain.log
(2) 對/etc/logstash/conf.d中文件沒有授權,如上授權
sudo chown -R logstash:logstash /etc/logstash
(3) java_service_logs.conf的語法很容易錯誤,其次就是某些配置項與其版本不匹配,可以啟動前測試下:
sudo /usr/share/logstash/bin/logstash -t -f java_service_logs.conf
(4) 對于logstash排錯,可以先將logstash.yml 日志級別設置為 debug,便于排錯
(5) 對于logstash不能收集日志到es,可以通過 stdout { codec => rubydebug } 將輸出結果先打印出來,不要直接輸入到es中。
還有對于input模塊,ignore_older => 0 該參數慎用,可能讀取不到。可以修改為 ignore_older => “15d”, 表示從當前15天到當前內容。
(6) 還可以利用打印到控制臺去測試grok匹配的數據
sudo /usr/share/logstash/bin/logstash -e ‘input { stdin { } } filter { grok { match => { “message” => “[%{TIMESTAMP_ISO8601:log_timestamp}] [%{DATA:log_thread}] [%{LOGLEVEL:log_level}] %{DATA:log_class} - %{GREEDYDATA:log_message}” } } } output { stdout { codec => rubydebug } }’