在我之前的文章“Elastic:運用 Elastic Stack 分析 Spring boot 微服務日誌 (一)”,我詳細講述瞭如何使用如下架構來進行對 Spring boot 應用進行日誌分析:
細心的開發者可能已經發現:我們的 Logstash 的配置文件每次只配置一個 log 文件,也就是說每個 Logstash 的實例只能處理一個文件。這在很多的情況下不是最優的。比如說,我們有10個 log 文件,那麼我們可能需要10個 Logstash 的實例來處理這個。由於 Logstash 的使用成本是非常高的。Logstash 的運行需要很多的資源來完成,通常會甚至需要專門的服務器來完成這樣的工作。那麼我們該如何完善我們的設計呢?
我們可以使用 Filebeat 來配合完成我們的工作。關於 Filebeat 如何配合 Logstash,並把數據發送 Elasticsearch 中,我們可以參閱我之前的另外一篇文章“Beats:通過Filebeat把日誌傳入到Elasticsearch”來進行詳述。參閱那篇文章,我們可以使用如下的架構來完善我們的設計:
在上面的架構中,我們使用 Filebeat 來分別讀取每個 log 文件。由於 Filebeat 是一個輕量級的數據攝入器,它並不消耗很多的資源。它可以和我們的每個微服務的應用部署在同一個服務器中,並輕鬆地把數據傳入到 Logstash 中。在這裏,我們可以使用 Logstash 超強的數據處理,轉換,豐富等能力對數據進一步地加工,並最終導入到 Elasticsearch 之中。最後,由 Kibana 來對數據進行分析我展現。 在這個架構中,我們所有的 Filebeat 共享一個 Logstash 的實例。
安裝
Filebeat
相比之前的架構,我們新增加了一個 Filebeat 的部分。我們打開 Kibana 界面:
點擊 Add log data 按鈕:
點擊上面的 System logs 鏈接:
我們首先現在 Filebeat 運行的平臺,並選擇相應的指令進行相應的安裝。在我們今天的練習中,我們並不需要啓動任何的模塊,這是因爲我們這個 log 不是屬於任何的模塊。是我們自己定義格式的日誌。我們有不需要配置任何的 Elasticsearch 及 Kibana,這是因爲我們會把數據傳入到 Logstash 中。在上面的指令中,我們只需要選擇指令進行安裝。
等我們安裝好 Filebeat,我們給 Filebeat 配置相應的配置文件:
filebeat_logstash.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /Users/liuxg/tmp/spring-boot-elastic.log
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
output.logstash:
hosts: ["localhost:5044"]
在這裏,我們在 paths 裏定義了日誌的路徑。同時我們使用了 mulitiline 來把多行日誌變爲一個文檔而不是每一行都變成一個文檔。如果大家對這個還是不很瞭解的話,請參閱我之前的文章“Beats:使用Filebeat傳送多行日誌”。
我們可以使用如下的指令來測試我們的配置文件:
/filebeat -c filebeat_logstash.yml test config
$ ./filebeat -c filebeat_logstash.yml test config
Config OK
上面顯示我們的配置文件沒有任何的錯誤。
我們可以使用如下的指令來測試我們的 output:
./filebeat -c filebeat_logstash.yml test output
$ ./filebeat -c filebeat_logstash.yml test output
logstash: localhost:5044...
connection...
parse host... OK
dns lookup... OK
addresses: ::1, 127.0.0.1
dial up... ERROR dial tcp 127.0.0.1:5044: connect: connection refused
上面顯示我們的 output 是有問題的。這個原因是很簡單的,這是因爲我們的 localhost:5044 服務沒有啓動。
啓動 Logstash
針對我們的最新的架構,我們需要重新設計我們的 Logstash 的配置文件:
logstash.conf
# Read input from filebeat by listening to port 5044 on which filebeat will send the data
input {
beats {
type => "test"
port => "5044"
}
}
filter {
#If log line contains tab character followed by 'at' then we will tag that entry as stacktrace
if [message] =~ "\tat" {
grok {
match => ["message", "^(\tat)"]
add_tag => ["stacktrace"]
}
}
}
output {
stdout {
codec => rubydebug
}
# Sending properly parsed log events to elasticsearch
elasticsearch {
hosts => ["localhost:9200"]
}
}
在上面,我們主要修改了 Input 部分:
input {
beats {
type => "test"
port => "5044"
}
}
其它的和之前的配置是一樣的。
爲了更清楚地表明 Elasticsearch 的數據是來自這次實驗的數據,我們在 Kibana 中對之前的 Logstash 的索引的數據進行刪除:
DELETE logstash-*
然後,我們啓動 Logstash:
sudo ./bin/logstash -f logstash.conf
上面顯示我們的 Logstash 已經成功運行了。
運行 Filebeat
接下來,我們開始運行 Filebeat。首先我們再次測試一下我們的 output:
$ ./filebeat -c filebeat_logstash.yml test output
logstash: localhost:5044...
connection...
parse host... OK
dns lookup... OK
addresses: ::1, 127.0.0.1
dial up... OK
TLS... WARN secure connection disabled
talk to server... OK
這次顯示我們的測試是成功的。我們接下來使用如下的指令來運行 Filebeat:
./filebeat -e -c filebeat_logstash.yml
上面顯示我們的 Filebeat 連接到 Logstash是成功的。我們可以到 Logstash 的 console 來查看一下:
上面顯示每一條被處理的文檔。
在 Kibana 中展示數據
在上面,我們看出數據已經被 Logstash 處理了。在 Kibana 中,打入如下的命令:
GET _cat/indices
我們可以看到一個新的以 Logstash 爲開頭的日誌索引已經生成了(還記得在上面我們已經把所有 logstash-* 的索引都刪除的指令嗎)。按照在上一個教程“Elastic:運用 Elastic Stack 分析 Spring boot 微服務日誌 (一)”中所描述的,我們創建一個index pattern,並展示數據:
我們可以使用之前的微服務接口生成更多的日誌:
我們再次衝查看最新的文檔:
再查看具有 stacktrace 的文檔: