難的不是技術,難的是業務。熟悉業務流程纔是最難的。php
其實搜索進來的每個人的需求不同,但願你能從個人這篇文章裏面收穫到。html
建議仍是看官方文檔,更全面一些。java
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,須要提取特定的字段
每個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,採集的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
我這裏採用的是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 |
cd /opt/
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-linux-x86_64.tar.gz
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"]
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 ...
elasticsearch 7之後的版本都自帶啓動腳本,只須要執行一下就行
訪問三個節點的其中一個的 9200端口 :http://192.168.31.61:9200/
查看一些接口:http://192.168.31.61:9200/_cat
查看index:http://192.168.31.61:9200/_cat/indices
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 &
能夠看到es集羣的一些經常使用的信息
http://192.168.31.61:9000
cd /opt/ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.12.1-linux-x86_64.tar.gz
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"
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
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
/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日誌
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
更改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;
原始日誌:其實就是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
原始日誌:
咱們提取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
總結:各類不一樣的日誌 能夠用不一樣的正則表達式去匹配出來。
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"]
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 &
http://192.168.31.61:5601
app_name:服務名稱
log_topics:nginx-access nginx-error php-info php-error
1,其實我這個是按照我這邊的業務場景配置的,但願對你有益。
2,官方文檔纔是最好的。
3,有問題留言,我會及時回覆。
共同成長。共同進步。