Elastic:運用 Elastic Stack 分析 Spring boot 微服務日誌 (二)

在我之前的文章“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 的文檔:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章