Elastic 技術棧之 Logstash 基礎
本文是 Elastic 技術棧(ELK)的 Logstash 應用。
如果不了解 Elastic 的安裝、配置、部署,可以參考:Elastic 技術棧之快速入門
簡介
Logstash 可以傳輸和處理你的日志、事務或其他數據。
功能
Logstash 是 Elasticsearch 的最佳數據管道。
Logstash 是插件式管理模式,在輸入、過濾、輸出以及編碼過程中都可以使用插件進行定制。Logstash 社區有超過 200 種可用插件。
工作原理
Logstash 有兩個必要元素:input 和 output ,一個可選元素:filter。
這三個元素,分別代表 Logstash 事件處理的三個階段:輸入 > 過濾器 > 輸出。

- input 負責從數據源采集數據。
- filter 將數據修改為你指定的格式或內容。
- output 將數據傳輸到目的地。
在實際應用場景中,通常輸入、輸出、過濾器不止一個。Logstash 的這三個元素都使用插件式管理方式,用戶可以根據應用需要,靈活的選用各階段需要的插件,並組合使用。
后面將對插件展開講解,暫且不表。
設置
設置文件
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.html
| 參數 | 描述 | 默認值 |
|---|---|---|
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-encoder 。logstash-logback-encoder 提供了 UDP / TCP / 異步方式來傳輸日志數據到 logstash。
TCP 應用
- 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
- 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 主流日志工具庫 。
UDP 應用
UDP 和 TCP 的使用方式大同小異。
- 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
- 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 主流日志工具庫 。
傳輸文件
在 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}
