Elastic 技術棧之 Logstash 基礎

Elastic 技術棧之 Logstash 基礎

本文是 Elastic 技術棧(ELK)的 Logstash 應用。html

若是不瞭解 Elastic 的安裝、配置、部署,能夠參考:Elastic 技術棧之快速入門java

簡介

Logstash 能夠傳輸和處理你的日誌、事務或其餘數據。node

功能

Logstash 是 Elasticsearch 的最佳數據管道。linux

Logstash 是插件式管理模式,在輸入、過濾、輸出以及編碼過程當中均可以使用插件進行定製。Logstash 社區有超過 200 種可用插件。nginx

工做原理

Logstash 有兩個必要元素:inputoutput ,一個可選元素:filtergit

這三個元素,分別表明 Logstash 事件處理的三個階段:輸入 > 過濾器 > 輸出。github

logstash 工做原理.png

  • input 負責從數據源採集數據。
  • filter 將數據修改成你指定的格式或內容。
  • output 將數據傳輸到目的地。

在實際應用場景中,一般輸入、輸出、過濾器不止一個。Logstash 的這三個元素都使用插件式管理方式,用戶能夠根據應用須要,靈活的選用各階段須要的插件,並組合使用。redis

後面將對插件展開講解,暫且不表。spring

設置

設置文件

  • logstash.yml:logstash 的默認啓動配置文件
  • jvm.options:logstash 的 JVM 配置文件。
  • startup.options (Linux):包含系統安裝腳本在 /usr/share/logstash/bin 中使用的選項爲您的系統構建適當的啓動腳本。安裝 Logstash 軟件包時,系統安裝腳本將在安裝過程結束時執行,並使用 startup.options 中指定的設置來設置用戶,組,服務名稱和服務描述等選項。

logstash.yml 設置項

節選部分設置項,更多項請參考:https://www.elastic.co/guide/en/logstash/current/logstash-settings-file.htmlsql

參數 描述 默認值
node.name 節點名 機器的主機名
path.data Logstash及其插件用於任何持久性需求的目錄。 LOGSTASH_HOME/data
pipeline.workers 同時執行管道的過濾器和輸出階段的工做任務數量。若是發現事件正在備份,或CPU未飽和,請考慮增長此數字以更好地利用機器處理能力。 Number of the host’s CPU cores
pipeline.batch.size 嘗試執行過濾器和輸出以前,單個工做線程從輸入收集的最大事件數量。較大的批量處理大小通常來講效率更高,可是以增長的內存開銷爲代價。您可能必須經過設置 LS_HEAP_SIZE 變量來有效使用該選項來增長JVM堆大小。 125
pipeline.batch.delay 建立管道事件批處理時,在將一個尺寸太小的批次發送給管道工做任務以前,等待每一個事件須要多長時間(毫秒)。 5
pipeline.unsafe_shutdown 若是設置爲true,則即便在內存中仍存在inflight事件時,也會強制Logstash在關閉期間退出。默認狀況下,Logstash將拒絕退出,直到全部接收到的事件都被推送到輸出。啓用此選項可能會致使關機期間數據丟失。 false
path.config 主管道的Logstash配置路徑。若是您指定一個目錄或通配符,配置文件將按字母順序從目錄中讀取。 Platform-specific. See [dir-layout].
config.string 包含用於主管道的管道配置的字符串。使用與配置文件相同的語法。 None
config.test_and_exit 設置爲true時,檢查配置是否有效,而後退出。請注意,使用此設置不會檢查grok模式的正確性。 Logstash能夠從目錄中讀取多個配置文件。若是將此設置與log.level:debug結合使用,則Logstash將記錄組合的配置文件,並注掉其源文件的配置塊。 false
config.reload.automatic 設置爲true時,按期檢查配置是否已更改,並在配置更改時從新加載配置。這也能夠經過SIGHUP信號手動觸發。 false
config.reload.interval Logstash 檢查配置文件更改的時間間隔。 3s
config.debug 設置爲true時,將徹底編譯的配置顯示爲調試日誌消息。您還必須設置log.level:debug。警告:日誌消息將包括任何傳遞給插件配置做爲明文的「密碼」選項,並可能致使明文密碼出如今您的日誌! false
config.support_escapes 當設置爲true時,帶引號的字符串將處理轉義字符。 false
modules 配置時,模塊必須處於上表所述的嵌套YAML結構中。 None
http.host 綁定地址 "127.0.0.1"
http.port 綁定端口 9600
log.level 日誌級別。有效選項:fatal > error > warn > info > debug > trace info
log.format 日誌格式。json (JSON 格式)或 plain (原對象) plain
path.logs Logstash 自身日誌的存儲路徑 LOGSTASH_HOME/logs
path.plugins 在哪裏能夠找到自定義的插件。您能夠屢次指定此設置以包含多個路徑。

啓動

命令行

經過命令行啓動 logstash 的方式以下:

bin/logstash [options]

其中 [options] 是您能夠指定用於控制 Logstash 執行的命令行標誌。

在命令行上設置的任何標誌都會覆蓋 Logstash 設置文件(logstash.yml)中的相應設置,但設置文件自己不會更改。

雖然能夠經過指定命令行參數的方式,來控制 logstash 的運行方式,但顯然這麼作很麻煩。

建議經過指定配置文件的方式,來控制 logstash 運行,啓動命令以下:

bin/logstash -f logstash.conf

若想了解更多的命令行參數細節,請參考:https://www.elastic.co/guide/en/logstash/current/running-logstash-command-line.html

配置文件

上節,咱們瞭解到,logstash 能夠執行 bin/logstash -f logstash.conf ,按照配置文件中的參數去覆蓋默認設置文件(logstash.yml)中的設置。

這節,咱們就來學習一下這個配置文件如何配置參數。

配置文件結構

在工做原理一節中,咱們已經知道了 Logstash 主要有三個工做階段 input 、filter、output。而 logstash 配置文件文件結構也與之相對應:

input {}

filter {}

output {}

每一個部分都包含一個或多個插件的配置選項。若是指定了多個過濾器,則會按照它們在配置文件中的顯示順序應用它們。

插件配置

插件的配置由插件名稱和插件的一個設置塊組成。

下面的例子中配置了兩個輸入文件配置:

input {
  file {
    path => "/var/log/messages"
    type => "syslog"
  }

  file {
    path => "/var/log/apache/access.log"
    type => "apache"
  }
}

您能夠配置的設置因插件類型而異。你能夠參考: Input Plugins, Output Plugins, Filter Plugins, 和 Codec Plugins

值類型

一個插件能夠要求設置的值是一個特定的類型,好比布爾值,列表或哈希值。如下值類型受支持。

  • Array
users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
  • Lists
path => [ "/var/log/messages", "/var/log/*.log" ]
  uris => [ "http://elastic.co", "http://example.net" ]
  • Boolean
ssl_enable => true
  • Bytes
my_bytes => "1113"   # 1113 bytes
  my_bytes => "10MiB"  # 10485760 bytes
  my_bytes => "100kib" # 102400 bytes
  my_bytes => "180 mb" # 180000000 bytes
  • Codec
codec => "json"
  • Hash
match => {
  "field1" => "value1"
  "field2" => "value2"
  ...
}
  • Number
port => 33
  • Password
my_password => "password"
  • URI
my_uri => "http://foo:bar@example.net"
  • Path
my_path => "/tmp/logstash"
  • String

  • 轉義字符

插件

input

Logstash 支持各類輸入選擇 ,能夠在同一時間從衆多經常使用來源捕捉事件。可以以連續的流式傳輸方式,輕鬆地從您的日誌、指標、Web 應用、數據存儲以及各類 AWS 服務採集數據。

經常使用 input 插件

  • file:從文件系統上的文件讀取,就像UNIX命令 tail -0F 同樣
  • syslog:在衆所周知的端口514上偵聽系統日誌消息,並根據RFC3164格式進行解析
  • redis:從redis服務器讀取,使用redis通道和redis列表。 Redis常常用做集中式Logstash安裝中的「代理」,它未來自遠程Logstash「託運人」的Logstash事件排隊。
  • beats:處理由Filebeat發送的事件。

更多詳情請見:Input Plugins

filter

過濾器是Logstash管道中的中間處理設備。若是符合特定條件,您能夠將條件過濾器組合在一塊兒,對事件執行操做。

經常使用 filter 插件

  • grok:解析和結構任意文本。 Grok目前是Logstash中將非結構化日誌數據解析爲結構化和可查詢的最佳方法。
  • mutate:對事件字段執行通常轉換。您能夠重命名,刪除,替換和修改事件中的字段。

  • drop:徹底放棄一個事件,例如調試事件。

  • clone:製做一個事件的副本,可能會添加或刪除字段。

  • geoip:添加有關IP地址的地理位置的信息(也能夠在Kibana中顯示驚人的圖表!)

更多詳情請見:Filter Plugins

output

輸出是Logstash管道的最後階段。一個事件能夠經過多個輸出,可是一旦全部輸出處理完成,事件就完成了執行。

經常使用 output 插件

  • elasticsearch:將事件數據發送給 Elasticsearch(推薦模式)。
  • file:將事件數據寫入文件或磁盤。
  • graphite:將事件數據發送給 graphite(一個流行的開源工具,存儲和繪製指標。 http://graphite.readthedocs.io/en/latest/)。
  • statsd:將事件數據發送到 statsd (這是一種偵聽統計數據的服務,如計數器和定時器,經過UDP發送並將聚合發送到一個或多個可插入的後端服務)。

更多詳情請見:Output Plugins

codec

用於格式化對應的內容。

經常使用 codec 插件

  • json:以JSON格式對數據進行編碼或解碼。
  • multiline:將多行文本事件(如java異常和堆棧跟蹤消息)合併爲單個事件。

更多插件請見:Codec Plugins

實戰

前面的內容都是對 Logstash 的介紹和原理說明。接下來,咱們來實戰一些常見的應用場景。

傳輸控制臺數據

stdin input 插件從標準輸入讀取事件。這是最簡單的 input 插件,通常用於測試場景。

應用

(1)建立 logstash-input-stdin.conf

input { stdin { } }
output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

更多配置項能夠參考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-stdin.html

(2)執行 logstash,使用 -f 來指定你的配置文件:

bin/logstash -f logstash-input-stdin.conf

傳輸 logback 日誌

想使用 logback + logstash ,可使用 logstash-logback-encoderlogstash-logback-encoder 提供了 UDP / TCP / 異步方式來傳輸日誌數據到 logstash。

TCP 應用

  1. logstash 配置

(1)建立 logstash-input-tcp.conf

input {
tcp {
  port => 9251
  codec => json_lines
  mode => server
}
}
output {
 elasticsearch { hosts => ["localhost:9200"] }
 stdout { codec => rubydebug }
}

更多配置項能夠參考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-tcp.html

(2)執行 logstash,使用 -f 來指定你的配置文件:bin/logstash -f logstash-input-udp.conf

  1. java 應用配置

(1)在 Java 應用的 pom.xml 中引入 jar 包:

<dependency>
 <groupId>net.logstash.logback</groupId>
 <artifactId>logstash-logback-encoder</artifactId>
 <version>4.11</version>
</dependency>

<!-- logback 依賴包 -->
<dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-core</artifactId>
 <version>1.2.3</version>
</dependency>
<dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 <version>1.2.3</version>
</dependency>
<dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-access</artifactId>
 <version>1.2.3</version>
</dependency>

(2)接着,在 logback.xml 中添加 appender

<appender name="ELK-TCP" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
 <!--
 destination 是 logstash 服務的 host:port,
 至關於和 logstash 創建了管道,將日誌數據定向傳輸到 logstash
 -->
 <destination>192.168.28.32:9251</destination>
 <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<logger name="io.github.dunwu.spring" level="TRACE" additivity="false">
 <appender-ref ref="ELK-TCP" />
</logger>

(3)接下來,就是 logback 的具體使用 ,若是對此不瞭解,不妨參考一下個人這篇博文:細說 Java 主流日誌工具庫

實例:個人logback.xml

UDP 應用

UDP 和 TCP 的使用方式大同小異。

  1. logstash 配置

(1)建立 logstash-input-udp.conf

input {
udp {
  port => 9250
  codec => json
}
}
output {
 elasticsearch { hosts => ["localhost:9200"] }
 stdout { codec => rubydebug }
}

更多配置項能夠參考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-udp.html

(2)執行 logstash,使用 -f 來指定你的配置文件:bin/logstash -f logstash-input-udp.conf

  1. java 應用配置

(1)在 Java 應用的 pom.xml 中引入 jar 包:

TCP 應用 一節中的引入依賴包徹底相同。

(2)接着,在 logback.xml 中添加 appender

<appender name="ELK-UDP" class="net.logstash.logback.appender.LogstashSocketAppender">
   <host>192.168.28.32</host>
   <port>9250</port>
 </appender>
 <logger name="io.github.dunwu.spring" level="TRACE" additivity="false">
   <appender-ref ref="ELK-UDP" />
</logger>

(3)接下來,就是 logback 的具體使用 ,若是對此不瞭解,不妨參考一下個人這篇博文:細說 Java 主流日誌工具庫

實例:個人logback.xml

傳輸文件

在 Java Web 領域,須要用到一些重要的工具,例如 Tomcat 、Nginx 、Mysql 等。這些不屬於業務應用,可是它們的日誌數據對於定位問題、分析統計一樣很重要。這時沒法使用 logback 方式將它們的日誌傳輸到 logstash。

如何採集這些日誌文件呢?別急,你可使用 logstash 的 file input 插件。

須要注意的是,傳輸文件這種方式,必須在日誌所在的機器上部署 logstash 。

應用

logstash 配置

(1)建立 logstash-input-file.conf

input {
    file {
        path => ["/var/log/nginx/access.log"]
        type => "nginx-access-log"
        start_position => "beginning"
    }
}

output {
    if [type] == "nginx-access-log" {
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "nginx-access-log"
        }
    }
}

(2)執行 logstash,使用 -f 來指定你的配置文件:bin/logstash -f logstash-input-file.conf

更多配置項能夠參考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html

小技巧

啓動、終止應用

若是你的 logstash 每次都是經過指定配置文件方式啓動。不妨創建一個啓動腳本。

# cd xxx 進入 logstash 安裝目錄下的 bin 目錄
logstash -f logstash.conf

若是你的 logstash 運行在 linux 系統下,不妨使用 nohup 來啓動一個守護進程。這樣作的好處在於,即便關閉終端,應用仍會運行。

建立 startup.sh

nohup ./logstash -f logstash.conf >> nohup.out 2>&1 &

終止應用沒有什麼好方法,你只能使用 ps -ef | grep logstash ,查出進程,將其kill 。不過,咱們能夠寫一個腳原本幹這件事:

建立 shutdown.sh

腳本很少解釋,請自行領會做用。

PID=`ps -ef | grep logstash | awk '{ print $2}' | head -n 1`
kill -9 ${PID}

資料

推薦閱讀

相關文章
相關標籤/搜索