本文是 Elastic 技術棧(ELK)的 Logstash 應用。html
若是不瞭解 Elastic 的安裝、配置、部署,能夠參考:Elastic 技術棧之快速入門java
Logstash 能夠傳輸和處理你的日誌、事務或其餘數據。node
Logstash 是 Elasticsearch 的最佳數據管道。linux
Logstash 是插件式管理模式,在輸入、過濾、輸出以及編碼過程當中均可以使用插件進行定製。Logstash 社區有超過 200 種可用插件。nginx
Logstash 有兩個必要元素:input
和 output
,一個可選元素:filter
。git
這三個元素,分別表明 Logstash 事件處理的三個階段:輸入 > 過濾器 > 輸出。github
在實際應用場景中,一般輸入、輸出、過濾器不止一個。Logstash 的這三個元素都使用插件式管理方式,用戶能夠根據應用須要,靈活的選用各階段須要的插件,並組合使用。redis
後面將對插件展開講解,暫且不表。spring
logstash.yml
:logstash 的默認啓動配置文件jvm.options
:logstash 的 JVM 配置文件。startup.options
(Linux):包含系統安裝腳本在 /usr/share/logstash/bin
中使用的選項爲您的系統構建適當的啓動腳本。安裝 Logstash 軟件包時,系統安裝腳本將在安裝過程結束時執行,並使用 startup.options
中指定的設置來設置用戶,組,服務名稱和服務描述等選項。節選部分設置項,更多項請參考: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 。
一個插件能夠要求設置的值是一個特定的類型,好比布爾值,列表或哈希值。如下值類型受支持。
users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
path => [ "/var/log/messages", "/var/log/*.log" ] uris => [ "http://elastic.co", "http://example.net" ]
ssl_enable => true
my_bytes => "1113" # 1113 bytes my_bytes => "10MiB" # 10485760 bytes my_bytes => "100kib" # 102400 bytes my_bytes => "180 mb" # 180000000 bytes
codec => "json"
match => { "field1" => "value1" "field2" => "value2" ... }
port => 33
my_password => "password"
my_uri => "http://foo:bar@example.net"
my_path => "/tmp/logstash"
String
轉義字符
Logstash 支持各類輸入選擇 ,能夠在同一時間從衆多經常使用來源捕捉事件。可以以連續的流式傳輸方式,輕鬆地從您的日誌、指標、Web 應用、數據存儲以及各類 AWS 服務採集數據。
tail -0F
同樣更多詳情請見:Input Plugins
過濾器是Logstash管道中的中間處理設備。若是符合特定條件,您能夠將條件過濾器組合在一塊兒,對事件執行操做。
mutate:對事件字段執行通常轉換。您能夠重命名,刪除,替換和修改事件中的字段。
drop:徹底放棄一個事件,例如調試事件。
clone:製做一個事件的副本,可能會添加或刪除字段。
geoip:添加有關IP地址的地理位置的信息(也能夠在Kibana中顯示驚人的圖表!)
更多詳情請見:Filter Plugins
輸出是Logstash管道的最後階段。一個事件能夠經過多個輸出,可是一旦全部輸出處理完成,事件就完成了執行。
更多詳情請見:Output Plugins
用於格式化對應的內容。
更多插件請見: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 + logstash ,可使用 logstash-logback-encoder 。logstash-logback-encoder 提供了 UDP / 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
(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 和 TCP 的使用方式大同小異。
(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 應用的 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}