Logstash - 內部架構



在本章中,我們將討論 Logstash 的內部架構及其不同的元件。

Logstash 服務架構

Logstash 從不同的伺服器和資料來源處理日誌,並且它充當發貨人。發貨人用於收集日誌,並且安裝在每個輸入源中。像 **Redis、Kafka** 或 **RabbitMQ** 這樣的代理是緩衝區,用於儲存索引器的檔案,可能有多個代理作為故障轉移例項。

像 **Lucene** 這樣的索引器用於索引日誌以提高搜尋效能,然後輸出儲存在 Elasticsearch 或其他輸出目標中。輸出儲存中的資料可用於 Kibana 和其他視覺化軟體。

Logstash Service Architecture

Logstash 內部架構

Logstash 管道由三個元件組成:**輸入、過濾器** 和 **輸出**。輸入部分負責指定和訪問輸入資料來源,例如 **Apache Tomcat 伺服器** 的日誌資料夾。

Logstash Internal Architecture

解釋 Logstash 管道的示例

Logstash 配置檔案包含有關 Logstash 的三個元件的詳細資訊。在本例中,我們建立一個名為 **Logstash.conf** 的檔案。

以下配置從輸入日誌“inlog.log”捕獲資料,並在沒有任何過濾器的情況下將其寫入輸出日誌“outlog.log”。

Logstash.conf

Logstash 配置檔案僅使用輸入外掛從 **inlog.log** 檔案複製資料,並使用輸出外掛將日誌資料重新整理到 **outlog.log** 檔案。

input {
   file {
      path => "C:/tpwork/logstash/bin/log/inlog.log"
   }
}
output {
   file {
      path => "C:/tpwork/logstash/bin/log/outlog.log"
   }
}

執行 Logstash

Logstash 使用 **–f** 選項指定配置檔案。

C:\logstash\bin> logstash –f logstash.conf

inlog.log

以下程式碼塊顯示了輸入日誌資料。

Hello tutorialspoint.com

outlog.log

Logstash 輸出包含訊息欄位中的輸入資料。Logstash 還向輸出新增其他欄位,如時間戳、輸入源路徑、版本、主機和標籤。

{
   "path":"C:/tpwork/logstash/bin/log/inlog1.log",
   "@timestamp":"2016-12-13T02:28:38.763Z",
   "@version":"1", "host":"Dell-PC",
   "message":" Hello tutorialspoint.com", "tags":[]
}

如您所見,Logstash 的輸出包含超出輸入日誌提供的的資料。輸出包含源路徑、時間戳、版本、主機名和標籤,這些用於表示額外的訊息,例如錯誤。

我們可以使用過濾器來處理資料並使其對我們的需求有用。在下一個示例中,我們使用過濾器獲取資料,該資料將輸出限制為僅包含類似 GET 或 POST 後跟 **唯一資源識別符號** 的資料。

Logstash.conf

在此 Logstash 配置中,我們添加了一個名為 **grok** 的過濾器以過濾輸入資料。與輸入日誌模式序列匹配的輸入日誌事件僅會帶有錯誤傳遞到輸出目標。Logstash 在不匹配 grok 過濾器模式序列的輸出事件中添加了一個名為“_grokparsefailure”的標籤。

Logstash 提供了許多用於解析流行伺服器日誌(如 Apache)的內建正則表示式模式。此處使用的模式需要一個類似 get、post 等的動詞,後跟一個統一資源識別符號。

input {
   file {
      path => "C:/tpwork/logstash/bin/log/inlog2.log"
   }
}
filter {
   grok {
      match => {"message" => "%{WORD:verb} %{URIPATHPARAM:uri}"}
   }
}
output {
   file {
      path => "C:/tpwork/logstash/bin/log/outlog2.log"
   }
}

執行 Logstash

我們可以使用以下命令執行 Logstash。

C:\logstash\bin> logstash –f  Logstash.conf

inlog2.log

我們的輸入檔案包含兩個由預設分隔符(即換行符)分隔的事件。第一個事件與 GROk 中指定的模式匹配,第二個事件不匹配。

GET /tutorialspoint/Logstash
Input 1234

outlog2.log

我們可以看到,第二個輸出事件包含“_grokparsefailure”標籤,因為它不匹配 grok 過濾器模式。使用者還可以透過在輸出外掛中使用 **‘if’** 條件來刪除輸出中的這些不匹配事件。

{
   "path":"C:/tpwork/logstash/bin/log/inlog2.log",
   "@timestamp":"2016-12-13T02:47:10.352Z","@version":"1","host":"Dell-PC","verb":"GET",
   "message":"GET /tutorialspoint/logstash", "uri":"/tutorialspoint/logstash", "tags":[]
}
{
   "path":"C:/tpwork/logstash/bin/log/inlog2.log",
   "@timestamp":"2016-12-13T02:48:12.418Z", "@version":"1", "host":"Dell-PC",
   "message":"t 1234\r", "tags":["_grokparsefailure"]
}
廣告