Logstash 配置Java日誌格式的方法

TechSynapse發表於2024-09-11

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 還提供了其他過濾外掛,如 datemutatejson 等,用於進一步處理和轉換日誌資料。

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 的配置非常靈活,可以根據我們的具體需求進行定製。上述示例提供了一些常見的配置選項,但請注意,我們需要根據我們的實際環境和需求進行選擇和調整。

相關文章