天天看點

es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana

需求場景:ES 叢集通過 Nginx 做了網關代理,需要把通路 ES 叢集的請求進行統計監控。

使用元件:Filebeat 收集,寫入 ES 叢集,通過 Kibana 的 dashboard 進行展示,即 ELK 的老本行,采用更輕量級的日志收集工具 Filebeat 而沒有使用 Logstash。

1. Nginx

對 Nginx 預設的日志格式進行了微調,将預設的

$time_local

修改為

$time_iso8601

,日志變化如下所示:

#before
171.0.0.1 - - [11/Nov/2021:00:00:02 +0800] 1.300 0.982 200 731171 "POST /index1/_search?timeout=30s HTTP/1.1" "-" "axios/0.19.2" "-"
#after
171.0.0.1 - - [2021-11-25T11:29:13+08:00] 0.008 0.008 200 137 "GET /index1/_search HTTP/1.1" "-" "python-urllib3/1.26.2" "-"           

Nginx 日志每行12個字段含義如下:

字段 含義
remote_addr 用戶端IP位址
- 占位符
remote_user 用戶端登入使用者名沒有則置為占位符 -
time 通路時間和時區
request_time 整個請求的總時間
upstream_response_time Nginx向後端請求的時間
status 請求傳回的http狀态碼
body_bytes_sent 發送給用戶端的位元組數
request 請求的URI和HTTP協定
http_referer 哪個頁面連結通路
http_user_agent 用戶端通路資訊,如浏覽器、手機用戶端等
http_x_forwarded_for 用戶端的真實ip通常web伺服器放在反向代理的後面

2. Filebeat

Filebeat 配置比較簡單,開箱即用,配置好 Input 為 Log,Output 為 ES 即可,如下所示:

filebeat.inputs:
#=========================== Filebeat inputs =============================
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access_whsh.log
#=========================== Filebeat inputs =============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
#=========================== Filebeat inputs =============================
setup.template.settings:
  index.number_of_shards: 1
  #index.codec: best_compression
setup.template.name: "es-request-log"
setup.template.pattern: "es-request-log-*"
setup.template.enabled: false
setup.template.overwrite: true
setup.template.fields: "esrequestfields.yml"
setup.ilm.enabled: false
#=========================== Filebeat inputs =============================
output.elasticsearch:
  hosts: ["172.0.0.1:9200","172.0.0.2:9200","172.0.0.3:9200"]
  index: "es-request-log-%{+yyyy.MM.dd}"
  pipeline: "es-request-log"
  # Protocol - either `http` (default) or `https`.
  protocol: "https"
  #api_key: "id:api_key"
  username: "elastic"
  password: "changeme"
  ssl.verification_mode: "none"
#=========================== Filebeat inputs =============================
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
           

這裡修改了 Filebeat 自帶的預設日志模闆和預設輸出到 ES 的索引,并添加了一個 pipeline 用于對 Nginx 日志進行拆分處理(Filebeat預設将每行日志輸出到

message

字段)。

修改預設索引的模闆字段

fields.yml

,并将其導出錄入到 ES 叢集内作為記錄日志索引的 template,具體做法可以參考官網:

Load the Elasticsearch index template

3. ES

ES 側需要配置好存放日志資料索引的模闆、ILM政策(非必須)、以及用到的 pipeline,名稱和上一步 Filebeat 配置中要對應。

  1. 模闆設定:
es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana

設定好别名、比對的索引字首、一些你想配置的 settings 以及字段結構:包括 Filebeat 自帶的一些字段以及主要的日志字段

message

和我們将通過 pipeline 拆解

message

字段擷取的一些将用于日志分析的字段。

  1. pipeline設定:
es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana

pipeline 主要作用是對

message

字段拆解:

- 通過`grok`正則比對方式比對到`message`内部的每個字段,并将其抽出;
- 通過`script`可以加一些對抽出字段的判斷,将請求聚類分析。
           

這裡可以任意處理資料,擷取自己想要的分析内容,或者也可以引入Logstash對資料進行處理。

4. Kibana

經過以上三步,資料已經進入到 ES 叢集内,通過 Kibana 可以對資料分析結果進行可視化展示,忽略一些 Filebeat 自帶的字段,資料内容如下所示:

es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana

我們可以對時間字段,某些 keyword 類字段進行聚合等統計數一些日志分析結果,并使用 dashboard 進行展示,部分示例如下:

  1. 統計請求的響應狀态:
es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana
  1. 分類統計時間段的請求數量:
es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana
  1. 統計查詢耗時的 pct (參考 jmeter 名額):
es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana
  1. 展示部分請求的部分字段(data table展示topN耗時等):
es實戰-收集Nginx日志可視化監控1. Nginx2. Filebeat3. ES4. Kibana

繼續閱讀