elk 日誌收集 filebeat 集羣搭建 php業務服務日誌 nginx日誌 json 7.12版本 ELK 解決方案

難的不是技術,難的是業務。熟悉業務流程纔是最難的。php

 

其實搜索進來的每個人的需求不同,但願你能從個人這篇文章裏面收穫到。html

建議仍是看官方文檔,更全面一些。java

 

1、背景

1,收集nginx  access  error日誌,nginx日誌最開始是main日誌,後來被我改爲了json日誌方便收集node

2,收集php info  error日誌,php日誌就是標準的linux

3,每個php服務都是docker容器啓動nginx

4,每個php容器服務裏面都有一個nginx服務git

5,須要收集日誌的php服務大概30個github

6,k8s集羣三臺節點正則表達式

7,須要收集qa,dev環境日誌,qa,dev其實就是k8s集羣裏面的兩個namespacesdocker

8,須要提取特定的字段

 

1.1 日誌目錄

每個php容器服務都是這個日誌結構

/var/log/nginx/access.log
/var/log/nginx/error.log
/var/www/html/storage/logs/lumen.log
/var/www/html/storage/autoLogs/sysError/lumen.log

 

1.2 思考點&解決方案

1,採集的Beat用哪一個

        filebeat:輕量級,cpu 內存小,我們的需求只是單純的採集數據。進程穩定。

2,Beat的部署方式

        filebeat部署在k8s 節點宿主機,二進制部署

3,日誌的採集方式

        Php容器日誌目錄掛載到宿主機

4,qa,dev環境怎麼區分

        kibana區分用index

        容器日誌目錄掛載到宿主機。

        $env=qa,dev

        $appname=php全部的服務名稱

        /data/service-logs/${env}/${appname}/{nginx,storage/{logs,autoLogs/sysError/}}

                例如:wxx 服務的dev環境宿主機目錄結構

                /data/service-logs/dev/wxx/nginx/      這個下面有access  error日誌

                /data/service-logs/dev/wxx/storage/logs/      php info日誌

                /data/service-logs/dev/wxx/storage/autoLogs/sysError/        php  error日誌

5,怎麼區分php服務

        kibana:添加字段app_name

6,日誌類型怎麼區分

        kibana:添加字段log_topics

 

2、集羣服務器配置

我這裏採用的是3節點,其實主要就是es集羣。

這樣的配置足夠我這的需求了,你能夠按照需求調整。

我這裏大概每小時收集5萬條數據。天天數據量大概是2G。

ip cpu mem 軟件
192.168.31.61 4 8G es,kibana,cerebro
192.168.31.62 4 8G  
192.168.31.63 4 8G  

 

3、部署服務

 

3.1 部署es

 

3.1.1 下載

cd /opt/

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-linux-x86_64.tar.gz

 

3.1.2 配置

tar xf elasticsearch-7.12.1-linux-x86_64.tar.gz
cd /opt/elasticsearch-7.12.1/config
 
node1
vim elasticsearch.yml
cluster.name: dev-qa-es                          # 集羣的名稱
node.name: 192.168.31.61                         # node1節點的名稱
path.data: /data/elasticsearch/data              # 數據目錄
path.logs: /data/elasticsearch/log               # 日誌目錄
network.host: 192.168.31.61                      # 節點的ip 就是監聽的地址
http.port: 9200                                  # es端口
discovery.seed_hosts: ["192.168.31.62", "192.168.31.63"]        # 除本身以外的兩個節點
cluster.initial_master_nodes: ["192.168.31.61", "192.168.31.62", "192.168.31.63"]        # 全部的master
 
node2
cluster.name: dev-qa-es
node.name: 192.168.31.62
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
network.host: 192.168.31.62
http.port: 9200
discovery.seed_hosts: ["192.168.31.61", "192.168.31.63"]
cluster.initial_master_nodes: ["192.168.31.61", "192.168.31.62", "192.168.31.63"]
 
node3
cluster.name: dev-qa-es
node.name: 192.168.31.63
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
network.host: 192.168.31.63
http.port: 9200
discovery.seed_hosts: ["192.168.31.61", "192.168.31.62"]
cluster.initial_master_nodes: ["192.168.31.61", "192.168.31.62", "192.168.31.63"]

 

3.1.3 配置jdk

1,由於elasticsearch是java寫的,因此須要java環境。

2,能夠本身手動在機器上面安裝java。可是會形成這臺機器上面的java環境固定。或者會對之前的java版本產生改變。

3,因此elasticsearch 7以上版本會自帶jdk,因此咱們只須要告訴elasticsearch使用自帶的jdk便可。

 

其實主要控制es用不用自帶java的 變量就倆 ES_JAVA_HOME   JAVA_HOME

cd /opt/elasticsearch-7.12.1/bin
 
vim elasticsearch-env
...
ES_HOME=`dirname "$SCRIPT"`
# now make ES_HOME absolute
ES_HOME=`cd "$ES_HOME"; pwd`
while [ "`basename "$ES_HOME"`" != "bin" ]; do
  ES_HOME=`dirname "$ES_HOME"`
done
ES_HOME=`dirname "$ES_HOME"`
ES_JAVA_HOME=/opt/elasticsearch-7.12.1/jdk   # 我只是添加了一個ES_JAVA_HOME變量,下面的if判斷會判斷這個變量。
# now set the classpath
ES_CLASSPATH="$ES_HOME/lib/*"
# now set the path to java
if [ ! -z "$ES_JAVA_HOME" ]; then        # 會判斷這個變量是否爲空 !不爲空 走下面的代碼
  JAVA="$ES_JAVA_HOME/bin/java"          # 這樣java環境就有了
  JAVA_TYPE="ES_JAVA_HOME"
elif [ ! -z "$JAVA_HOME" ]; then
  # fallback to JAVA_HOME
  echo "warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" >&2
  JAVA="$JAVA_HOME/bin/java"
  JAVA_TYPE="JAVA_HOME"
else
  # use the bundled JDK (default)
  if [ "$(uname -s)" = "Darwin" ]; then
    # macOS has a different structure
    JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java"
  else
    JAVA="$ES_HOME/jdk/bin/java"
  fi
  JAVA_TYPE="bundled JDK"
fi
...

 

3.1.4 啓動es

elasticsearch 7之後的版本都自帶啓動腳本,只須要執行一下就行

 

3.1.5 檢查es集羣

訪問三個節點的其中一個的 9200端口 :http://192.168.31.61:9200/

查看一些接口:http://192.168.31.61:9200/_cat

查看index:http://192.168.31.61:9200/_cat/indices

 

3.2 部署cerebro

cerebro是一個es的監控工具,相似於es的插件同樣。能夠同時監控多個集羣。

cd /opt/
wget https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip
unzip cerebro-0.9.4.zip
cd cerebro-0.9.4
 
配置
vim conf /application .conf
 
加入如下配置
hosts = [
  {
    host = "http://192.168.31.61:9200"    # es地址
    name = "dev-qa-es"                    # 集羣名稱
    headers-whitelist = [ "x-proxy-user", "x-proxy-roles", "X-Forwarded-For" ]
  }
]
啓動
cd bin
nohup . /cerebro 2>&1 &

 

3.2.1 訪問

能夠看到es集羣的一些經常使用的信息

http://192.168.31.61:9000

 

3.3 Kibana

 

3.3.1 下載

cd /opt/
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.12.1-linux-x86_64.tar.gz

 

3.3.2 配置

cd /opt/
tar xf kibana-7.12.1-linux-x86_64.tar.gz 
 
配置
cd /opt/kibana-7.12.1
vim config/kibana.yml
server.port: 5601                # 監聽端口
server.host: "192.168.31.61"     # 監聽地址
elasticsearch.hosts: ["http://192.168.31.61:9200", "http://192.168.31.62:9200", "http://192.168.31.63:9200"]    # es hosts
i18n.locale: "zh-CN"

 

3.3.3 啓動&訪問

cd /opt/kibana-7.12.1-linux-x86_64/bin
 
nohup su - kibana -c "/opt/kibana-7.12.1-linux-x86_64/bin/kibana" &    # 前提是須要新建好kibana用戶

訪問:http://192.168.31.61:5601

 

3.4 部署filebeat

3.4.1 下載

cd /opt/
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.12.1-linux-x86_64.tar.gz
tar xf filebeat-7.12.1-linux-x86_64.tar.gz

 

3.4.2 目錄規劃

/data/service-logs/{dev,qa}/$appname/{nginx,storage/{logs,autoLogs/sysError}}

 

        $env=qa,dev

        $appname=php全部的服務名稱

        /data/service-logs/${env}/${appname}/{nginx,storage/{logs,autoLogs/sysError/}}

                例如:wxx 服務的dev環境宿主機目錄結構

                /data/service-logs/dev/wxx/nginx/      這個下面有access  error日誌

                /data/service-logs/dev/wxx/storage/logs/      php info日誌

                /data/service-logs/dev/wxx/storage/autoLogs/sysError/        php  error日誌

 

3.4.3 服務日誌掛載到宿主機

1,更改php服務容器的yaml文件的volumeMounts
好比這個dev環境的wxx服務

volumeMounts:
  - mountPath: /var/log/nginx
    name: pod-nginx-log
  - mountPath: /var/www/html/storage/logs
    name: pod-storage-logs
  - mountPath: /var/www/html/storage/autoLogs/sysError
    name: pod-storage-autologs
volumes:
- hostPath:
    path: /data/service-logs/dev/wxx/nginx
    type: ""
  name: pod-nginx-log
- hostPath:
    path: /data/service-logs/dev/wxx/storage/logs
    type: ""
  name: pod-storage-logs
- hostPath:
    path: /data/service-logs/dev/wxx/storage/autoLogs/sysError
    type: ""
  name: pod-storage-autologs

 

3.4.4 nginx json格式輸出

更改nginx.conf
加入json格式定義
 
log_format access_json_log  escape=json '{"@timestamp":"$time_iso8601",'
                                  '"remote_addr":"$remote_addr",'
                                  '"remote_user":"$remote_user",'
                                  '"body_bytes_sent":"$body_bytes_sent",'
                                  '"request_time":"$request_time",'
                                  '"http_host":"$http_host",'
                                  '"request_length":"$request_length",'
                                  '"upstream_response_length":"$upstream_response_length",'
                                  '"upstream_response_time":"$upstream_response_time",'
                                  '"request_body":"$request_body",'
                                  '"upstream_status":"$upstream_status",'
                                  '"status":"$status",'
                                  '"request":"$request",'
                                  '"request_method":"$request_method",'
                                  '"http_referrer":"$http_referrer",'
                                  '"http_x_forwarded_for":"$http_x_forwarded_for",'
                                  '"http_user_agent":"$http_user_agent"}';
 
access_log  /var/log/nginx/access.log  access_json_log;

 

3.4.5 php info日誌提取匹配

原始日誌:其實就是filebeat支持正則表達式,只要你能匹配出你想要的日誌內容就行

咱們提取[2021-07-05 13:00:00] 到下一個[2021-07-05 13:01:00] 中間的內容

因此匹配就能夠寫成,

multiline.pattern: '^\['    # 其實就是以[開頭的行
multiline.negate: true
multiline.match: after
multiline.negate: true
multiline.match: after

這倆就是控制知足匹配以前的仍是以後的,官方文檔:https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html

3.4.5 php error日誌提取匹配

 原始日誌: 

咱們提取2021-07-05 15:00:00 到下一個 2021-07-05 15:01:00

multiline.pattern: '^[0-9]{4}-[0-9]{2}-'    # 以日期開頭
multiline.negate: true
multiline.match: after

 

總結:各類不一樣的日誌 能夠用不一樣的正則表達式去匹配出來。

 

3.4.6 個人filebeat配置

cd /opt/k8s/efk/filebeat-7.12.1-linux-x86_64/
 
服務太多我只展現了一個服務的配置。其餘的都是同樣的
vim filebeat.yml
filebeat.inputs:
#########################################################################
#### 日誌收集 ####
# 一個項目爲一個#組,一個組裏有4個收集規則
# collectLogStart
############################## operation-api ##############################
- type: log
  enabled: true                  # 啓用輸入
  encoding: utf-8                # 字符編碼
  paths:
    - /data/service-logs/dev/operation-api/nginx/access.log     # 日誌路徑
  tail_files: true                # true 從文件的末尾讀取,false 從開頭讀取文件
  json.keys_under_root: true      # json解碼
  json.overwrite_keys: true       # json解碼
  fields:                         # 額外增長字段
    app_env: "dev"
    app_name: "operation-api"
    log_topics: "nginx-access"
  fields_under_root: true         # 增長的字段是否爲頂級key
- type: log
  enabled: true
  encoding: utf-8
  paths:
    - /data/service-logs/dev/operation-api/nginx/error.log
  tail_files: true
  fields:
    app_env: "dev"
    app_name: "operation-api"
    log_topics: "nginx-error"
  fields_under_root: true
- type: log
  enabled: true
  encoding: utf-8
  paths:
    - /data/service-logs/dev/operation-api/storage/logs/lumen*.log
  multiline.pattern: '^\['
  multiline.negate: true
  multiline.match: after
  tail_files: true
  fields:
    app_env: "dev"
    app_name: "operation-api"
    log_topics: "php-logs"
  fields_under_root: true
- type: log
  enabled: true
  encoding: utf-8
  paths:
    - /data/service-logs/dev/operation-api/storage/autoLogs/sysError/lumen*.log
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-'
  multiline.negate: true
  multiline.match: after
  tail_files: true
  fields:
    app_env: "dev"
    app_name: "operation-api"
    log_topics: "php-errlogs"
  fields_under_root: true
############################## operation-api ##############################
 
# collectLogEnd
################################### 日誌收集配置 ########################
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false


# 自定義index
setup.template.name: "zm-log"
setup.template.pattern: "zm-log-*"
setup.template.overwrite: true
setup.template.enabled: true
setup.ilm.enabled: false    # 這個配置相當重要,是關於ilm生命週期。能夠查看官方文檔。這個是關閉自帶的,而後使用自定義的。
 
output.elasticsearch:
  hosts: ["192.168.31.61:9200","192.168.31.62:9200","192.168.31.63:9200"]
  loadbalance: true       # 開啓負載
  pipelines:              # 有關filebeat使用pipeline 我後期單獨寫一篇文章:http://www.javashuo.com/article/p-wlsgkujn-wr.html
    - pipeline: "extract-traceid-pipeline"
      when.contains:
        log_topics: "php-errlogs"
 
  indices:                # index的配置,這個配置就是說當app_env=qa的時候用index: "zm-log-qa-%{+yyyy.MM.dd-000001}"
    - index: "zm-log-qa-%{+yyyy.MM.dd-000001}"
      when.contains:
        app_env: "qa"
 
    - index: "zm-log-dev-%{+yyyy.MM.dd}-000001"
      when.contains:
        app_env: "dev"
 
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
 
  - drop_fields:         # 這個是丟棄哪些key
      fields: ["host.mac","host.ip","host.os.name"]

 

3.4.7 啓動

nohup /opt/k8s/efk/filebeat-7.12.1-linux-x86_64/filebeat -e -c /opt/k8s/efk/filebeat-7.12.1-linux-x86_64/filebeat.yml >/dev/null 2>&1 &

 

3.5 訪問kibana

http://192.168.31.61:5601

 

3.5.1 字段解釋

app_name:服務名稱

log_topics:nginx-access    nginx-error    php-info   php-error

 

4、總結

1,其實我這個是按照我這邊的業務場景配置的,但願對你有益。

2,官方文檔纔是最好的。

3,有問題留言,我會及時回覆。

 

 

共同成長。共同進步。

相關文章
相關標籤/搜索