Logstash 是用於日誌收集的開源工具,通常與 Elasticsearch 和 Kibana 一起使用,形成 ELK Stack(現在稱為 Elastic Stack)。Logstash 非常靈活,可以透過配置檔案(通常是 .conf
檔案)來定義資料的輸入、處理和輸出。對於處理 Java 日誌,一個常見的場景是解析 Java 應用生成的日誌檔案(如使用 Log4j 或 Logback 生成的日誌檔案)。
1.方法一: Logstash 配置示例
下面是一個 Logstash 配置示例,該示例假設我們有一個 Java 應用,其日誌檔案遵循常見的日誌格式,例如 Logback 的預設模式(包含時間戳、日誌級別、執行緒名稱、日誌記錄器名稱和訊息)。
首先,我們需要一個 Logstash 配置檔案,比如命名為 java_log_pipeline.conf
。以下是該配置檔案的一個示例:
input {
file {
# 指定日誌檔案的路徑
path => "/path/to/your/java/application/logs/app.log"
# 只在檔案有新內容時觸發讀取
start_position => "beginning"
# 讀取檔案時使用的字元編碼
codec => "plain" { charset => "UTF-8" }
# 檢測檔案變化的時間間隔(秒)
sincedb_path => "/dev/null"
# 忽略舊資料
ignore_older => 0
}
}
filter {
# 使用 grok 外掛來解析日誌
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\] %{LOGLEVEL:level} %{DATA:logger} - %{GREEDYDATA:message}" }
}
# 可以新增其他過濾器,如 date、mutate 等
date {
match => ["timestamp", "ISO8601"]
target => "@timestamp"
}
# 轉換日誌級別為小寫(可選)
mutate {
lowercase => ["level"]
}
}
output {
# 輸出到 Elasticsearch
elasticsearch {
hosts => ["http://localhost:9200"]
index => "java-app-logs-%{+YYYY.MM.dd}"
document_type => "_doc"
# 如果 Elasticsearch 設定了使用者名稱和密碼
# user => "your_username"
# password => "your_password"
}
# 可以在控制檯列印日誌,用於除錯
stdout {
codec => rubydebug
}
}
注意事項:
(1)檔案路徑:path
欄位需要修改為我們的 Java 應用實際生成日誌檔案的路徑。
(2)時間戳格式:如果日誌中的時間戳格式不是 ISO8601,我們需要修改 grok
外掛中的 TIMESTAMP_ISO8601
為相應的模式。
(3)Elasticsearch 配置:如果我們的 Elasticsearch 服務不是執行在 localhost
或埠不是 9200
,需要相應地修改 hosts
欄位。
(4)除錯:使用 stdout
輸出可以幫助我們驗證 Logstash 是否正確解析了日誌。
這個配置示例首先透過 file
外掛讀取日誌檔案,然後使用 grok
外掛來解析日誌訊息,並將其分解成更具體的欄位(如時間戳、日誌級別、訊息等)。之後,使用 date
外掛將時間戳欄位轉換為 Logstash 理解的格式,並作為事件的時間戳。最後,透過 elasticsearch
外掛將處理後的日誌傳送到 Elasticsearch 進行儲存和進一步分析。同時,使用 stdout
外掛將日誌列印到控制檯以便於除錯。
2.方法二: Logstash 輸入、過濾和輸出配置
除了之前提到的基於檔案的輸入配置外,Logstash 還支援多種其他型別的輸入配置,這些配置可以根據我們的具體需求和環境進行選擇和調整。以下是一些常見的 Logstash 輸入、過濾和輸出配置示例,這些配置可以與 Java 日誌處理相結合:
2.1 輸入配置
(1)TCP 輸入:
如果我們希望 Logstash 透過 TCP 埠接收來自 Java 應用的日誌(例如,Java 應用配置了 Log4j 或 Logback 以傳送日誌到 TCP Socket),我們可以使用 TCP 輸入外掛。
input {
tcp {
port => 5000
codec => json_lines # 如果 Java 應用傳送的是 JSON 格式的日誌
# 或者使用 plain 編碼,如果日誌不是 JSON 格式
# codec => plain { charset => "UTF-8" }
}
}
注意:如果 Java 應用傳送的是非 JSON 格式的日誌,並且我們希望使用 Grok 外掛進行解析,我們可能需要保持 codec => plain
並確保日誌格式與 Grok 模式匹配。
(2)Beats 輸入:
Logstash 可以透過 Beats input 外掛接收來自 Filebeat 或其他 Beats 產品的資料。這種方法特別適合於需要從多個源收集日誌的情況,並且 Filebeat 可以在宿主機上高效地收集、壓縮和轉發日誌。
在 Logstash 配置中,我們不需要為 Beats 輸入指定特別的配置,因為 Beats 會作為客戶端傳送資料到 Logstash 指定的埠(通常是 5044,但可以自定義)。然而,我們需要在 Filebeat 配置中指定 Logstash 的地址和埠。
2.2 過濾配置
除了之前提到的 Grok 外掛外,Logstash 還提供了其他過濾外掛,如 date
、mutate
、json
等,用於進一步處理和轉換日誌資料。
JSON 過濾:
如果 Java 應用傳送的是 JSON 格式的日誌,我們可以使用 json
外掛來解析這些日誌,並將 JSON 欄位作為單獨的欄位提取出來。
filter {
json {
source => "message" # 假設整個日誌訊息是一個 JSON 字串
}
}
注意:如果日誌訊息本身已經是一個 JSON 物件,並且我們想直接解析它,那麼上述配置是適用的。但是,如果日誌訊息包含 JSON 字串(即被引號包圍的 JSON),我們可能需要先在 grok
外掛中提取該字串,然後再使用 json
外掛進行解析。
2.3 輸出配置
除了 Elasticsearch 之外,Logstash 還支援多種輸出配置,如檔案、標準輸出、HTTP、Kafka 等。
(1)檔案輸出:
如果我們需要將處理後的日誌儲存到檔案中,可以使用 file
輸出外掛。
output {
file {
path => "/path/to/your/output/file.log"
codec => line { format => "Custom format: %{message}" }
}
}
注意:這裡的 format
是可選的,用於定義輸出檔案的格式。如果不指定,Logstash 將使用預設的格式。
(2)標準輸出:
在除錯過程中,我們可能希望將日誌輸出到控制檯。這可以透過 stdout
外掛實現。
output {
stdout { codec => rubydebug }
}
rubydebug
編碼器將提供一個易於閱讀的格式化輸出,包括事件的所有欄位。
綜上所述,Logstash 的配置非常靈活,可以根據我們的具體需求進行定製。上述示例提供了一些常見的配置選項,但請注意,我們需要根據我們的實際環境和需求進行選擇和調整。