ELK 日志分析平台 (Elasticsearch + Logstash + Kibana) : 圖解+秒懂+史上最全


文章很長,而且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 為您奉上珍貴的學習資源 :

免費贈送 :《尼恩Java面試寶典》 持續更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備
免費贈送 經典圖書:《Java高並發核心編程(卷1)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高並發核心編程(卷2)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:《Java高並發核心編程(卷3)加強版》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 經典圖書:尼恩Java面試寶典 最新版 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取


一鍵安裝測試環境的大部分組件

bridge網絡管理

不指定網絡驅動時默認創建的bridge網絡

docker network create monitor-network

查看網絡內部信息

docker network inspect monitor-network

列所有列表的網絡

docker network  ls

移除指定的網絡

docker network rm default_network

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

一鍵安裝 promtail-loki

rm -rf  /home/docker-compose/promtail-loki
cp -rf /vagrant/3G-middleware/promtail-loki  /home/docker-compose/


cd /home/docker-compose/

chmod 777 -R  promtail-loki

cd promtail-loki

docker-compose --compatibility  up  -d



docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


grafana 默認密碼 admin admin

http://cdh2:3000/explore?left=["now-1h","now","-- Grafana --",{}]&orgId=1

{job="varlogs-nginx"}

增加數據源

http://loki:3100/

docker exec -it dev_ware_nginx /bin/sh

一鍵安裝 skywalking

cd /home/docker-compose/skywalking
docker-compose down


rm -rf  /home/docker-compose/skywalking

cd /
cp -rf /vagrant/3G-middleware/skywalking /home/docker-compose/

chmod 777 -R  /home/docker-compose/skywalking

cd /home/docker-compose/skywalking

ls -l

docker-compose --compatibility  up  -d



docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


訪問

SkyWalking

http://cdh2:13800/

kibana

http://cdh2:15601

基礎環境

nacos

在這里插入圖片描述

一鍵安裝 base-ware

含rocketmq

cd /home/docker-compose/base-env

docker-compose down


rm -rf  /home/docker-compose/base-env
cp -rf /vagrant/base-env  /home/docker-compose/


cd /home/docker-compose/

chmod 777 -R  base-env

cd base-env

docker-compose --compatibility  up  -d


docker-compose  logs -f


docker exec -it zookeeper /bin/bash



/work/zookeeper/bin/zkServer.sh status
 cat /work/zookeeper/conf/zoo.cfg

docker-compose  logs -f



docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


Zookeeper集群各節點容器說明列表

節點目錄名 容器名 client port follower port election port
zk-01 zk-01 2181 2888 3888
zk-02 zk-02 2182 2889 3889
zk-03 zk-03 2183 2890 3890

Zookeeper配置

sit-ware目錄下的.env

.env配置文件為docker-compose.yml提供了多個zookeeper的發現服務節點列表

配置格式為 server.x=x節點主機ip:隨從端口:選舉端口;客戶端口 其中xZOO.MY.ID的數值,客戶端口前是;

# set args to docker-compose.yml by default
# set zookeeper servers, pattern is `server.x=ip:follower-port:election-port;client:port`,
# such as "server.1=192.168.1.1:2888:3888;2181 server.2=192.168.1.2:2888:3888;2181", 
# `x` is the `ZOO.MY.ID` in docker-compose.yml, multiple server separator by white space.
# now you can overide the ip for server.1 server.2 server.3, here demonstrate in one machine so ip same.
ZOO_SERVERS=server.1=zk-01:2888:3888;2181 server.2=zk-02:2889:3889;2182 server.3=zk-03:2890:3890;2183

 zk-01:
      image: zookeeper:3.5.5
      restart: always
      container_name: zk-01
      ports:
          - 2181:2181
          - 2888:2888
          - 3888:3888
      environment:
          ZOO_MY_ID: 1
          ZOO_SERVERS: ${ZOO_SERVERS}
    networks:
      base-env-network:
         aliases:
           - zk-01
     links: 
      - zk-02:zk-02
      - zk-03:zk-03

Zookeeper集群使用

  1. 請確保所布署的 1~3 台服務器網絡可以ping通
  2. 確保第一台主機的2181\2888\3888端口未占用,第二台主機的2182\2889\3889端口未占用,第三台主機的2183\2890\3890端口未占用
  3. 復制zk-01到第一台主機、復制zk-02到第二台主機、復制zk-03到第三台主機
  4. 修改.env中的ZOO_SERVERS的值,按上述配置要求修改。

一鍵安裝 sit-ware

springcloud-gateway

cd /home/docker-compose/sit-ware/springcloud-gateway

docker-compose down
 
docker image  rm springcloud-gateway:1.0-SNAPSHOT

rm -rf  /home/docker-compose/sit-ware/springcloud-gateway

cp -rf /vagrant/sit-ware/springcloud-gateway  /home/docker-compose/sit-ware


cd /home/docker-compose/sit-ware

chmod 777 -R  springcloud-gateway

cd springcloud-gateway

docker-compose --compatibility  up  -d



docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


docker exec -it springcloud-gateway /bin/bash



java -server -Xms64m -Xmx256m   -Dserver.port=7790 -Dspring.profiles.active=sit  -jar  /vagrant/sit-ware/springcloud-gateway/springcloud-gateway-1.0-SNAPSHOT.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication


java -server -Xms64m -Xmx256m -javaagent: -Dskywalking.agent.service_name=springcloud-gateway -Dskywalking.collector.backend_service=127.0.0.1  -Dserver.port=7790 -Dspring.profiles.active=sit  -jar /app/springcloud-gateway.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication

message-dispatcher



mkdir -p  /home/docker-compose/sit-ware/message-dispatcher

cd /home/docker-compose/sit-ware/message-dispatcher

docker-compose down
 
docker image  rm message-dispatcher:1.0-SNAPSHOT

rm -rf  /home/docker-compose/sit-ware/message-dispatcher

cp -rf /vagrant/sit-ware/message-dispatcher  /home/docker-compose/sit-ware


cd /home/docker-compose/sit-ware

chmod 777 -R  message-dispatcher

cd message-dispatcher

docker-compose --compatibility  up  -d

docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


docker exec -it message-dispatcher /bin/bash



java -server -Xms64m -Xmx256m   -Dserver.port=7790 -Dspring.profiles.active=sit  -jar  /vagrant/sit-ware/springcloud-gateway/springcloud-gateway-1.0-SNAPSHOT.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication


java -server -Xms64m -Xmx256m -javaagent: -Dskywalking.agent.service_name=springcloud-gateway -Dskywalking.collector.backend_service=127.0.0.1  -Dserver.port=7790 -Dspring.profiles.active=sit  -jar /app/springcloud-gateway.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication

app-provider


mkdir -p  /home/docker-compose/sit-ware/app-provider

cd /home/docker-compose/sit-ware/app-provider

docker-compose down
 
docker image  rm app-provider:1.0-SNAPSHOT

rm -rf  /home/docker-compose/sit-ware/app-provider

cp -rf /vagrant/sit-ware/app-provider  /home/docker-compose/sit-ware


cd /home/docker-compose/sit-ware

chmod 777 -R  app-provider

cd app-provider

docker-compose --compatibility  up  -d

docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


docker exec -it message-dispatcher /bin/bash



java -server -Xms64m -Xmx256m   -Dserver.port=7790 -Dspring.profiles.active=sit  -jar  /vagrant/sit-ware/springcloud-gateway/springcloud-gateway-1.0-SNAPSHOT.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication


java -server -Xms64m -Xmx256m -javaagent: -Dskywalking.agent.service_name=springcloud-gateway -Dskywalking.collector.backend_service=127.0.0.1  -Dserver.port=7790 -Dspring.profiles.active=sit  -jar /app/springcloud-gateway.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication

Spring Boot整合ELK+Filebeat構建日志系統

ELK指的是Elastic公司下面Elasticsearch、Logstash、Kibana三大開源框架首字母大寫簡稱。
Elasticsearch、Logstash、Kibana三大開源框架首字母大寫簡稱。

ELK的關系

  1. Logstash可以將數據收集起來統一刷入Elasticsearch中
  2. 數據在Elasticsearch中進行分析然后通過kibana進行展示

在這里插入圖片描述

Logstash:從各種數據源搜集數據,並對數據進行過濾、分析、豐富、統一格式等操作,然后存儲到 ES。

Elasticsearch:對大容量的數據進行接近實時的存儲、搜索和分析操作。

Kibana:數據分析和可視化平台。與 Elasticsearch 配合使用,對數據進行搜索、分析和以統計圖表的方式展示。

ELK的應用

  • 異常分析

通過將應用的日志內容通過Logstash輸入到Elasticsearch中來實現對程序異常的分析排查

  • 業務分析

將消息的通訊結果通過Logstash輸入到Elasticsearch中來實現對業務效果的整理

  • 系統分析

將處理內容的延遲作為數據輸入到Elasticsearch中來實現對應用性能的調優

ELK-logstash和filebeat日志收集的簡單案例

1 對應的鏡像版本

本章只講解logstash和filebeat需要了解elasticsearch和kibana安裝的請看
<<ELK-ElasticSearch和kibana圖形化工具>>

elasticsearch:7.2.0
kibana:7.2.0
logstash:7.2.0
filebeat:7.2.0

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

logstash 介紹

Logstash 是一款強大的數據處理工具,它可以實現數據傳輸,格式處理,格式化輸出,

logstash 還有強大的插件功能,常用於日志處理.
logstash我們只讓它進行日志處理,處理完之后將其輸出到elasticsearch。

官方文檔

https://www.elastic.co/guide/en/logstash/7.17/index.html

安裝logstash

掛載目錄說明
創建/home/qw/elk/logstash 這個目錄存放Losgtash的配置文件
logstash.yml 空文件(7.x版本鏡像中這個有連接es的默認配置 需要覆蓋)
logstash.conf 是logstash的核心配置文件需要根據下面的需要配置對應參數
/home/qw/elk/testlog 這個文件夾下存放需要讀取的日志

執行命令

docker run -p 5044:5044 --name logstash -d \
--link=es:elasticsearch \
-v /home/qw/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /home/qw/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /home/qw/elk/testlog:/home \
logstash:7.2.0

配置logstash

https://www.elastic.co/guide/en/logstash/7.17/logstash-settings-file.html

參考配置

 path.data: /home/logstash/data
 config.reload.interval: 3s
 dead_letter_queue.enable: false

 api.http.port: 9600-9700
 xpack.monitoring.enabled: true
 xpack.monitoring.elasticsearch.username: "logstash_system"
 xpack.monitoring.elasticsearch.password: "d1Acosm6Eo"
 xpack.monitoring.elasticsearch.hosts: "http://elasticsearch:9200"
 xpack.monitoring.collection.pipeline.details.enabled: true



stash第一個事件

Logstash管道有兩個必需元素,輸入和輸出,以及一個可選元素filter。 輸入插件使用來自源的數據,過濾器插件在您指定時修改數據,輸出插件將數據寫入目標。
如下圖

img

根據官方文檔Logstash對數據的處理主要流程是

  1. 首先數據傳入logstash,在其內部對數據進行過濾和處理
  2. logstash將處理過的數據傳遞給Elasticsearch
  3. Elasticsearch對數據進行存儲、創建索引等內容
  4. kibana對數據提供可視化的支持

Logstash的核心流程的三個環節

Logstash核心分三個環節:

  • 數據輸入
  • 數據處理
  • 數據輸出

其數據輸入、處理、輸出主要在配置中間中下面部分進行配置

input {}
filter {}
output {}

logstash數值類型

  • 數組

match =>["datetime", "UNIX", "ISO8601"]

  • 布爾

必須是一個true或false

ssl_enable => true

  • 字節

一個字段是字節字符串字段表示有效字節的單元。它是一種方便的方式在特定尺寸的插件選項。

支持SI (k M G T P E Z Y)和Binary (TiKimigipiziyiei)單位。

二進制單元在基座單元和Si-1024在基底1000。

這個字段是大小寫敏感的。如果未指定單位,則整數表示的字符串的字節數。

my_bytes => "1113" # 1113 bytes 

my_bytes => "10MiB" # 10485760 bytes

 my_bytes => "100kib" # 102400bytes 

my_bytes => "180 mb"# 180000000 bytes
  • 編解碼器

codec => "json"

  • 哈希

哈希是一個鍵值對的集合中指定的格式,多個鍵值對的條目以空格分隔而不是逗號。

match => { "field1" => "value1" "field2" =>"value2" ... }

  • 數字

數字必須有效的數字值(浮點或整數)。

port => 33

  • 密碼

密碼是一個字符串的單個值,則不對其進行記錄或打印。

my_password => "password"

  • uri

my_uri =>"http://foo:bar@example.net"

  • 路徑

一個路徑是一個字符串,表示系統運行的有效路徑。

my_path =>"/tmp/logstash"

  • 轉義序列

默認地,轉義字符沒有被啟用。如果你希望使用轉義字符串序列,您需要在你的logstash.yml中設置config.support_escapes: true

Text Result
\r carriage return (ASCII 13)
\n new line (ASCII 10)
\t tab (ASCII 9)
\ backslash (ASCII 92)
" double quote (ASCII 34)
' single quote (ASCII 39)

logstash 條件判斷

有時您只想在特定條件下過濾或輸出事件。為此,您可以使用條件。

Logstash中的條件查看和行為與編程語言中的條件相同。條件語句支持if,else if以及else報表和可以被嵌套。

條件語法

if EXPRESSION{ ... } else if EXPRESSION { ... } else { ... }

logstash 比較運算符

  等於: ==, !=, <, >, <=, >=
  正則: =~, !~ (checks a pattern on the right against a string value on the left)
  包含關系: in, not in

  支持的布爾運算符:and, or, nand, xor

  支持的一元運算符: !

作用 符號
等於 ==
不等於 !=
小於 <
大於 >
小於等於 <=
大於等於 >=
匹配正則 =~
不匹配正則 !~
包含 in
不包含 not in
and
or
非與 nand
非或 xor
復合表達式 ()
取反符合 !()

數據輸入環節

input配置定義了數據的來源。其主要支持下面方式

事件源可以是從stdin屏幕輸入讀取,可以從file指定的文件,也可以從es,filebeat,kafka,redis等讀取

stdin

監控控制台輸入

要測試Logstash安裝成功,運行最基本的Logstash管道。 執行以下的命令

bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e 標志使您可以直接從命令行指定配置。

通過在命令行指定配置,可以快速測試配置,而無需在迭代之間編輯文件。

示例中的管道從標准輸入stdin獲取輸入,並以結構化格式將輸入移動到標准輸出stdout。

啟動Logstash后,等到看到“Pipeline main started”,然后在命令提示符下輸入hello world,顯示的如下:

hello world
{
          "host" => "VM_0_13_centos",
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => 2019-07-02T06:26:28.684Z
}

file

監控文件內容

file{
    path => ['/var/log/nginx/access.log']  #要輸入的文件路徑
    type => 'nginx_access_log'
    start_position => "beginning"
}

  • path 可以用/var/log/.log,/var/log/**/.log,

  • type 通用選項. 用於激活過濾器

  • start_position 選擇logstash開始讀取文件的位置,begining或者end。

還有一些常用的例如:discover_interval,exclude,sincedb_path,sincedb_write_interval等可以參考官網

syslogs

從syslogs讀取數據

syslog{
    port =>"514" 
    type => "syslog"
}

# port 指定監聽端口(同時建立TCP/UDP的514端口的監聽)

#從syslogs讀取需要實現配置rsyslog:
# cat /etc/rsyslog.conf   加入一行
*.* @172.17.128.200:514   #指定日志輸入到這個端口,然后logstash監聽這個端口,如果有新日志輸入則讀取
# service rsyslog restart   #重啟日志服務

beats

從Elastic beats接收數據

beats {
    port => 5044   #要監聽的端口
}
# 還有host等選項

# 從beat讀取需要先配置beat端,從beat輸出到logstash。
# vim /etc/filebeat/filebeat.yml 
..........
output.logstash:
hosts: ["localhost:5044"]

kafka

從kafka topic中讀取數據

kafka{
    bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
    topics => ["access_log"]
    group_id => "logstash-file"
    codec => "json"
}
kafka{
    bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
    topics => ["weixin_log","user_log"]  
    codec => "json"
}


# bootstrap_servers 用於建立群集初始連接的Kafka實例的URL列表。# topics  要訂閱的主題列表,kafka topics# group_id 消費者所屬組的標識符,默認為logstash。kafka中一個主題的消息將通過相同的方式分發到Logstash的group_id
# codec 通用選項,用於輸入數據的編解碼器。

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

數據處理環節

filter plugin 過濾器插件,主要是對數據進行處理。

grok

解析文本並構造 。把非結構化日志數據通過正則解析成結構化和可查詢化

Grok 是一個十分強大的 Logstash Filter 插件,它可以通過正則解析任意文本,將非結構化日志數據格式轉換為結構化的、方便查詢的結構。它是目前 Logstash 中解析非結構化日志數據最好的方式。

Grok 的語法規則是:
這里的 “語法” 指的是匹配模式,例如,使用 NUMBER 模式可以匹配出數字,IP 模式則會匹配出 127.0.0.1 這樣的 IP 地址。比如按以下格式輸入內容:

172.16.213.132 [16/Jun/2020:16:24:19 +0800] "GET / HTTP/1.1" 403 5039

那么,
• %{IP:clientip} 匹配模式將獲得的結果為:clientip: 172.16.213.132
• %{HTTPDATE:timestamp} 匹配模式將獲得的結果為:timestamp: 16/Jun/2020:16:24:19 +0800
• %{QS:referrer} 匹配模式將獲得的結果為:referrer: “GET / HTTP/1.1”
到這里為止,我們已經獲取了上面輸入中前三個部分的內容,分別是 clientip、timestamp 和 referrer 三個字段。

如果要獲取剩余部分的信息,方法類似。

在線調試 Grok,可點擊這里進行在線調試,非常方便。

下面是一個組合匹配模式,它可以獲取上面輸入的所有內容:

%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}

正則匹配是非常嚴格的匹配,在這個組合匹配模式中,使用了轉義字符 \,這是因為輸入的內容中有空格和中括號。

通過上面這個組合匹配模式,我們將輸入的內容分成了 5 個部分,即 5 個字段。將輸入內容分割為不同的數據字段,這對於日后解析和查詢日志數據非常有用,這正是我們使用 grok 的目的。

Logstash 默認提供了近 200 個匹配模式(其實就是定義好的正則表達式)讓我們來使用,

可以在 Logstash 安裝目錄下找到。例如,我這里的路徑為:

/usr/local/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns

此目錄下有定義好的各種匹配模式,基本匹配定義在 grok-patterns 文件中。

從這些定義好的匹配模式中,可以查到上面使用的四個匹配模式對應的定義規則。

除此之外,還有很多默認定義好的匹配模式文件,比如 httpd、java、linux-syslog、redis、mongodb、nagios 等,這些已經定義好的匹配模式,可以直接在 Grok 過濾器中進行引用。

當然也可以定義自己需要的匹配模式。

在了解完 Grok 的匹配規則之后,下面通過一個配置實例深入介紹下 Logstash 是如何將非結構化日志數據轉換成結構化數據的。

首先看下面的一個事件配置文件:

input{
stdin{}
}
filter{
grok{
match => ["message","%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}"]
}
}
output{
stdout{
codec => "rubydebug"
}
}

在這個配置文件中,輸入配置成了 stdin,在 filter 中添加了 grok 過濾插件,並通過 match 來執行正則表達式解析,

grok 中括號中的正則表達式就是上面提到的組合匹配模式,然后通過 rubydebug 編碼格式輸出信息。

這樣的組合有助於調試和分析輸出結果。

通過此配置啟動 Logstash 進程后,我們仍然輸入之前給出的那段內容:

172.16.213.132 [16/Jun/2020:16:24:19 +0800] "GET / HTTP/1.1" 403 5039

然后,查看 rubydebug 格式的日志輸出,內容如下:

{
     "timestamp" => "16/Jun/2020:16:24:19 +0800",
      "response" => "403",
         "bytes" => "5039",
      "@version" => "1",
      "clientip" => "172.16.213.132",
          "host" => "nnmaster.cloud",
      "referrer" => "\"GET / HTTP/1.1\"",
       "message" => "172.16.213.132 [16/Jun/2020:16:24:19 +0800] \"GET / HTTP/1.1\" 403 5039",
    "@timestamp" => 2020-06-16T07:46:53.120Z
}

從這個輸出可知,通過 Grok 定義好的 5 個字段都獲取到了內容,並正常輸出了。

date

日期解析 解析字段中的日期,然后轉存到@timestamp

[2018-07-04 17:43:35,503]

grok{
      match => {"message"=>"%{DATA:raw_datetime}"}
}
date{
       match => ["raw_datetime","YYYY-MM-dd HH:mm:ss,SSS"]
        remove_field =>["raw_datetime"]
}
#將raw_datetime存到@timestamp 然后刪除raw_datetime



#24/Jul/2018:18:15:05 +0800
date {
      match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z]
}



[2018-07-04 17:43:35,503]

grok{
      match => {"message"=>"%{DATA:raw_datetime}"}
}
date{
       match => ["raw_datetime","YYYY-MM-dd HH:mm:ss,SSS"]
        remove_field =>["raw_datetime"]
}

#將raw_datetime存到@timestamp 然后刪除raw_datetime

mutate

對字段做處理 重命名、刪除、替換和修改字段。

Mutate過濾器的配置選項

下面是過濾器支持的配置項,配置項詳情參考下面的詳解。

選項 類型 是否必須 簡述
convert hash No 轉化命令,是對字段類型做轉化,例如:String轉為integer
copy hash No 將一個已經存在的字段復制給另一個字段。
gsub array No 通過正則表達式匹配字段的值,然后替換為指定的字符串。
join hash No 使用分隔符連接數組。
lowercase array No 將string類型的字段值轉化為小寫的形式。
merge hash No 合並兩個數組或者Hash類型的字段。string類型的字段會自動的合並為一個數組。
coerce hash No 為存在但是不為空的字段設置默認值
rename hash No 字段重命名
replace hash No 將一個字段的值替換為一個新的值。
split hash No 將一個字段按照指定符號切割為數組。
strip array No 去除字段中的空格。
update hash No 更新字段為一個新值。
uppercase array No 將字符串字段轉化為大寫形式。
capitalize array No 將字符串字段轉化為首字母大寫的形式。
tag_on_failure string No 錯誤發生時的配置

covert

covert:類型轉換。類型包括:integer,float,integer_eu,float_eu,string和boolean

  • 字段類型為 hash
  • 沒有默認值

將字段轉化為不同的類型,例如:string 轉 integer。

如果被轉化的字段類型是數組,數組的所有成員都將被轉化。如果對象是hash 就不會進行轉化。

實例:

filter {
  mutate {
    convert => {
      "fieldname" => "integer"
      "booleanfield" => "boolean"
    }
  }
}

split

split:使用分隔符把字符串分割成數組

eg:

mutate{
    split => {"message"=>","}
}

aaa,bbb


{
    "@timestamp" => 2018-06-26T02:40:19.678Z,
      "@version" => "1",
          "host" => "localhost",
       "message" => [
        [0] "aaa",
        [1] "bbb"
    ]}

192,128,1,100

{
        "host" => "localhost",
     "message" => [
      [0] "192",
      [1] "128",
      [2] "1",
      [3] "100"
 ],
  "@timestamp" => 2018-06-26T02:45:17.877Z,
    "@version" => "1"
}


mutate{
    split => {"message"=>","}
}

merge

merge:合並字段 。數組和字符串 ,字符串和字符串

eg:

filter{
    mutate{
        add_field => {"field1"=>"value1"}
    }
    mutate{ 
          split => {"message"=>"."}   #把message字段按照.分割
    }
    mutate{
        merge => {"message"=>"field1"}   #將filed1字段加入到message字段
    }
}

輸入:abc



{
       "message" => [
        [0] "abc,"
        [1] "value1"
    ],
    "@timestamp" => 2018-06-26T03:38:57.114Z,
        "field1" => "value1",
      "@version" => "1",
          "host" => "localhost"
}

輸入:abc,.123



{
       "message" => [
        [0] "abc,",
        [1] "123",
        [2] "value1"
    ],
    "@timestamp" => 2018-06-26T03:38:57.114Z,
        "field1" => "value1",
      "@version" => "1",
          "host" => "localhost"
}

rename

rename:對字段重命名

filter{
    mutate{
        rename => {"message"=>"info"}
    }
}

123


{
    "@timestamp" => 2018-06-26T02:56:00.189Z,
          "info" => "123",
      "@version" => "1",
          "host" => "localhost"
}



remove_field:移除字段

mutate {
    remove_field => ["message","datetime"]
}

join

join:用分隔符連接數組,如果不是數組則不做處理

mutate{
        split => {"message"=>":"}
}
mutate{
        join => {"message"=>","}
}

abc:123
{
    "@timestamp" => 2018-06-26T03:55:41.426Z,
       "message" => "abc,123",
          "host" => "localhost",
      "@version" => "1"
}
aa:cc
{
    "@timestamp" => 2018-06-26T03:55:47.501Z,
       "message" => "aa,cc",
          "host" => "localhost",
      "@version" => "1"
}


gsub:用正則或者字符串替換字段值。僅對字符串有效

mutate{
        gsub => ["message","/","_"]   #用_替換/
    }

------>
a/b/c/
{
      "@version" => "1",
       "message" => "a_b_c_",
          "host" => "localhost",
    "@timestamp" => 2018-06-26T06:20:10.811Z
}

update:更新字段。如果字段不存在,則不做處理

mutate{
        add_field => {"field1"=>"value1"}
    }
    mutate{
        update => {"field1"=>"v1"}
        update => {"field2"=>"v2"}    #field2不存在 不做處理
    }
---------------->
{
    "@timestamp" => 2018-06-26T06:26:28.870Z,
        "field1" => "v1",
          "host" => "localhost",
      "@version" => "1",
       "message" => "a"
}


replace:更新字段。如果字段不存在,則創建

mutate{
        add_field => {"field1"=>"value1"}
    }
    mutate{
        replace => {"field1"=>"v1"}
        replace => {"field2"=>"v2"}
    }
---------------------->
{
       "message" => "1",
          "host" => "localhost",
    "@timestamp" => 2018-06-26T06:28:09.915Z,
        "field2" => "v2",        #field2不存在,則新建
      "@version" => "1",
        "field1" => "v1"
}


geoip

根據來自Maxmind GeoLite2數據庫的數據添加有關IP地址的地理位置的信息

 geoip {
            source => "clientip"
            database =>"/tmp/GeoLiteCity.dat"
        }

ruby

ruby插件可以執行任意Ruby代碼

filter{
    urldecode{
        field => "message"
    }
    ruby {
        init => "@kname = ['url_path','url_arg']"
        code => " 
            new_event = LogStash::Event.new(Hash[@kname.zip(event.get('message').split('?'))]) 
            event.append(new_event)"
    }
    if [url_arg]{
        kv{
            source => "url_arg"
            field_split => "&"
            target => "url_args"
            remove_field => ["url_arg","message"]
        }
    }
}
# ruby插件
# 以?為分隔符,將request字段分成url_path和url_arg
-------------------->
www.test.com?test
{
       "url_arg" => "test",
          "host" => "localhost",
      "url_path" => "www.test.com",
       "message" => "www.test.com?test",  
      "@version" => "1",
    "@timestamp" =>  2018-06-26T07:31:04.887Z
}
www.test.com?title=elk&content=學習elk
{
      "url_args" => {
          "title" => "elk",
        "content" => "學習elk"
    },
          "host" => "localhost",
      "url_path" => "www.test.com",
      "@version" => "1",
    "@timestamp" =>  2018-06-26T07:33:54.507Z
}

urldecode

用於解碼被編碼的字段,可以解決URL中 中文亂碼的問題

urldecode{
        field => "message"
    }

# field :指定urldecode過濾器要轉碼的字段,默認值是"message"
# charset(缺省): 指定過濾器使用的編碼.默認UTF-8

kv

通過指定分隔符將字符串分割成key/value

kv{
        prefix => "url_"   #給分割后的key加前綴
        target => "url_ags"    #將分割后的key-value放入指定字段
        source => "message"   #要分割的字段
        field_split => "&"    #指定分隔符
        remove_field => "message"
    }
-------------------------->
a=1&b=2&c=3
{
            "host" => "localhost",
       "url_ags" => {
          "url_c" => "3",
          "url_a" => "1",
          "url_b" => "2"
    },
      "@version" => "1",
    "@timestamp" => 2018-06-26T07:07:24.557Z

useragent

添加有關用戶代理(如系列,操作系統,版本和設備)的信息

if [agent] != "-" {
  useragent {
    source => "agent"
    target => "ua"
    remove_field => "agent"
  }
}
# if語句,只有在agent字段不為空時才會使用該插件
#source 為必填設置,目標字段
#target 將useragent信息配置到ua字段中。如果不指定將存儲在根目錄中


說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

數據輸出

output配置定義了數據輸出目標

stdout

將數據輸出到屏幕上

input{
      file{
        path=>"/home/order.log"
 	    discover_interval => 10 
 	    start_position => "beginning"
      }
}
output{
    stdout { codec => rubydebug }
}

在這里插入圖片描述

file

將數據寫入文件

讀取指定文件-輸出到文件

input{
      file{
            path=>"/home/order.log"
 	    discover_interval => 10 
 	    start_position => "beginning"
      }
}
output{
     file{
            path=>"/home/aaa.log"
      }
}

ps: 需要注意的是 這里的輸出文件必須要求 w的權限 看看是否報錯 如果報錯需要進入容器賦權

kafka

數據發送到kafka

 kafka{
        bootstrap_servers => "localhost:9092"
        topic_id => "test_topic"  #必需的設置。生成消息的主題
    }

elasticseach

數據存儲到elasticseach中

讀取指定文件-輸出到es

input{
      file{
            path=>"/home/order.log"
 	    discover_interval => 10 
 	    start_position => "beginning"
      }
}
output{
      elasticsearch{
            hosts=>["172.30.66.86:9200"]
            index => "test-%{+YYYY.MM.dd}"
      }
}

讀取filebeat-輸出到es集群

在分布式系統中,一台主機可能有多個應用,應用將日志輸出到主機的指定目錄,這時由logstash來搬運日志並解析日志,然后輸出到elasticsearch上。

由於於logstash是java應用,解析日志是非的消耗cpu和內存,logstash安裝在應用部署的機器上顯得非常的笨重。

最常見的做法是用filebeat部署在應用的機器上,logstash單獨部署,然后由filebeat將日志輸出給logstash解析,解析完由logstash再傳給elasticsearch。

在上面的配置中,輸入數據源為filebeat,輸出源為elasticsearch。

修改logstash的安裝目錄的config目錄下的logstash-sample.conf文件,配置如下:

input {
  beats {
    port => "5044"
  }
}

filter {
   if [fields][doc_type] == 'message-dispatcher' {
    grok {
			  match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVALOGMESSAGE:msg}" }
	   	}
   }

}

output {
  elasticsearch {
        hosts => [ "elasticsearch:9200" ]
        index => "%{[fields][doc_type]}-%{+YYYY.MM.dd}"
    }
}

更多的輸入和輸出源的配置見官網

https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html

在kibana顯示的效果

在這里插入圖片描述

在kibana組件上查看,可以看到創建了一個filebeat開頭的數據索引,如下圖:

img

在日志搜索界面,可以看到service-hi應用輸出的日志,如圖所示:

img

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

啟動elk

一鍵安裝 es+kibana


mkdir -p cd /home/docker-compose/sit-ware/elasticsearch_kibana

cd /home/docker-compose/sit-ware/elasticsearch_kibana
docker-compose down


rm -rf  /home/docker-compose/sit-ware/elasticsearch_kibana

cd /
cp -rf /vagrant/sit-ware/elasticsearch_kibana /home/docker-compose/sit-ware

chmod 777 -R  /home/docker-compose/sit-ware/elasticsearch_kibana

cd /home/docker-compose/sit-ware/elasticsearch_kibana

ls -l

docker-compose --compatibility  up  -d



docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


kibana

http://cdh2:15601

一鍵安裝 skywalking+logstash

mkdir -p cd /home/docker-compose/sit-ware/logstash_skywalking

cd /home/docker-compose/sit-ware/logstash_skywalking
docker-compose down


rm -rf  /home/docker-compose/sit-ware/logstash_skywalking

cd /
cp -rf /vagrant/sit-ware/logstash_skywalking /home/docker-compose/sit-ware

chmod 777 -R  /home/docker-compose/sit-ware/logstash_skywalking

cd /home/docker-compose/sit-ware/logstash_skywalking

ls -l

docker-compose --compatibility  up  -d

docker-compose  logs -f  logstash


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


kibana

http://cdh2:15601

訪問kibana

SkyWalking

http://cdh2:13800/

kibana

http://cdh2:15601

在這里插入圖片描述

使用filebeat發送日志

filebeat介紹

Filebeat是一個輕量級日志傳輸Agent,可以將指定日志轉發到Logstash、Elasticsearch、Kafka、Redis等中。Filebeat占用資源少,而且安裝配置也比較簡單,支持目前各類主流OS及Docker平台。

Filebeat是用於轉發和集中日志數據的輕量級傳送程序。作為服務器上的代理安裝,Filebeat監視您指定的日志文件或位置,收集日志事件,並將它們轉發到Elasticsearch或Logstash進行索引。

Filebeat的工作方式如下:啟動Filebeat時,它將啟動一個或多個輸入,這些輸入將在為日志數據指定的位置中查找。對於Filebeat所找到的每個日志,Filebeat都會啟動收集器。每個收割機都讀取一個日志以獲取新內容,並將新日志數據發送到libbeat,libbeat會匯總事件並將匯總的數據發送到您為Filebeat配置的輸出。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9xi1idFV-1601197715419)(https://www.elastic.co/guide/en/beats/filebeat/6.5/images/filebeat.png#pic_center)]

Filebeat下載頁面

https://www.elastic.co/cn/downloads/past-releases#filebeat

Filebeat文件夾結構
描述
filebeat 用於啟動filebeat的二進制文件
data 持久化數據文件的位置
logs Filebeat創建的日志的位置
modules.d 簡化filebeat配置的模板文件夾,如nginx/kafka等日志收集模板
filebeat.yml filebeat配置文件
Filebeat啟動命令
./filebeat -e -c filebeat配置文件

filebeat和beats的關系

  首先filebeat是Beats中的一員。
  Beats在是一個輕量級日志采集器,其實Beats家族有6個成員,早期的ELK架構中使用Logstash收集、解析日志,但是Logstash對內存、cpu、io等資源消耗比較高。相比Logstash,Beats所占系統的CPU和內存幾乎可以忽略不計。
目前Beats包含六種工具:

  • Packetbeat:網絡數據(收集網絡流量數據)
  • Metricbeat:指標(收集系統、進程和文件系統級別的CPU和內存使用情況等數據)
  • Filebeat:日志文件(收集文件數據)
  • Winlogbeat:windows事件日志(收集Windows事件日志數據)
  • Auditbeat:審計數據(收集審計日志)
  • Heartbeat:運行時間監控(收集系統運行時的數據)

制作filebeat鏡像

官方文檔

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html

下載filebeat,下載命令如下:

https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.0-linux-x86_64.tar.gz

 wget  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.2.0-linux-x86_64.tar.gz
 
 
tar -zxvf filebeat-7.2.0-linux-x86_64.tar.gz
mv filebeat-7.2.0-linux-x86_64 /usr/share/
cd /usr/share/filebeat-7.2.0-linux-x86_64/

制作基礎的unbantu鏡像

why unbantu? not alpine? not centos?

Alpine 只有僅僅 5 MB 大小,並且擁有很友好的包管理機制。Docker 官方推薦使用 Alpine 替代 Ubuntu 做為容器的基礎鏡像。

曾經嘗試使用alpine:3.7作為底層鏡像, 按照zookeeper,但是一直啟動不來,換成了centos的鏡像,排查過程反復實驗,耗時很久。

網上小伙伴構建filebeat鏡像,基於alpine:3.7, 構建后的鏡像運行時報“standard_init_linux.go:190: exec user process caused "no such file or directory"”,故最后還是選擇ubuntu。

這里選擇ubuntu的原因,是其作為底層打包出來的鏡像比centos要小很多。

# 基礎鏡像 生成的鏡像作為基礎鏡像
FROM ubuntu:18.04


# 指定維護者的信息
MAINTAINER 尼恩@瘋狂創客圈

# RUN apt-get update  && apt-get -y install openjdk-8-jdk



#install wget,sudo,python,vim,ping and ssh command

RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list   && apt-get  clean && \
    apt-get update && apt-get -y install wget && apt-get -y install sudo && \
    apt-get -y install iputils-ping && \
    apt-get -y install net-tools && \
    apt install -y tzdata && \
    rm -rf /etc/localtime  && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&  dpkg-reconfigure -f noninteractive tzdata && \
    apt-get  clean

 #    echo "Asia/Shanghai" > /etc/timezone &&  dpkg-reconfigure -f noninteractive tzdata && \
 


# RUN dpkg-reconfigure -f noninteractive tzdata
    
# RUN apt-get clean


 #apt-get -y install python && \
 # apt-get -y install vim && \
 #  apt-get -y install openssh-server && \
 # apt-get -y install python-pip  && \


# 復制並解壓
ADD jdk-8u121-linux-x64.tar.gz /usr/local/


ENV work_path /usr/local
WORKDIR $work_path

# java
ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV JRE_HOME  /usr/local/jdk1.8.0_121/jre
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
ENV PATH ${PATH}:${JAVA_HOME}/bin

dockfile add命令:

ADD指令的功能是將主機構建環境(上下文)目錄中的文件和目錄、以及一個URL標記的文件 拷貝到鏡像中。

其格式是: ADD 源路徑 目標路徑

注意事項:

1、如果源路徑是個文件,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把源文件拷貝到該目錄下。

如果目標路徑不存在,則會自動創建目標路徑。

2、如果源路徑是個文件,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個文件。

如果目標路徑不存在,會以目標路徑為名創建一個文件,內容同源文件;

如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。

如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。

3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的文件拷貝進來。

如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。

4、如果源文件是個歸檔文件(壓縮文件,比如 .tar文件),則docker會自動幫解壓。

推送鏡像到dockerhub

這個鏡像解決了jdk問題,時區問題

推送到了dockerhub,大家可以直接作為基礎鏡像使用

docker login

docker tag 8d0abdffe76f nien/ubuntu:18.04

docker push nien/ubuntu:18.04

制作filebeat鏡像

官方文檔

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html

下載filebeat,下載命令如下:

https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.0-linux-x86_64.tar.gz

 wget  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.2.0-linux-x86_64.tar.gz
 
 
tar -zxvf filebeat-7.2.0-linux-x86_64.tar.gz
mv filebeat-7.2.0-linux-x86_64 /usr/share/
cd /usr/share/filebeat-7.2.0-linux-x86_64/

dockerfile

# 基礎鏡像 生成的鏡像作為基礎鏡像
FROM nien/ubuntu:18.04


# 指定維護者的信息
MAINTAINER 尼恩@瘋狂創客圈


# 復制並解壓
ADD filebeat-7.14.0-linux-x86_64.tar.gz /usr/local/



構建之后,進入容器,可以看到 /usr/local 目錄下的filebeat-7.14.0-linux-x86_64

[root@cdh2 filebeat]# docker run -it filebeat:7.14.0 /bin/bash
root@7ba04f21f26e:/usr/local# ll
total 48
drwxr-xr-x 1 root root 4096 Apr  2 09:26 ./
drwxr-xr-x 1 root root 4096 Mar 16 03:27 ../
drwxr-xr-x 2 root root 4096 Mar 16 03:27 bin/
drwxr-xr-x 2 root root 4096 Mar 16 03:27 etc/
drwxr-xr-x 5 root root 4096 Apr  2 09:26 filebeat-7.14.0-linux-x86_64/
drwxr-xr-x 2 root root 4096 Mar 16 03:27 games/
drwxr-xr-x 2 root root 4096 Mar 16 03:27 include/
drwxr-xr-x 8 uucp  143 4096 Dec 13  2016 jdk1.8.0_121/
drwxr-xr-x 2 root root 4096 Mar 16 03:27 lib/
lrwxrwxrwx 1 root root    9 Mar 16 03:27 man -> share/man/
drwxr-xr-x 2 root root 4096 Mar 16 03:27 sbin/
drwxr-xr-x 1 root root 4096 Apr  2 00:44 share/
drwxr-xr-x 2 root root 4096 Mar 16 03:27 src/

推送鏡像到dockerhub

這個鏡像解決了jdk問題,時區問題

推送到了dockerhub,大家可以直接作為基礎鏡像使用

[root@cdh2 filebeat]# docker tag fb44037ab5f9 nien/filebeat:7.14.0

[root@cdh2 filebeat]# docker push nien/filebeat:7.14.0
The push refers to repository [docker.io/nien/filebeat]
069c957c7a4e: Pushing [=======>                                           ]  19.99MB/140MB
b17e3cbc28a1: Mounted from nien/ubuntu
5695cc8dd56c: Mounted from nien/ubuntu
9d6787a516e7: Mounted from nien/ubuntu


如果要收集日志,就可以用這個基礎鏡像加點配置就ok啦

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

message-dispatcher微服務的filebeat.yml配置:

filebeat.inputs:
- type: message-dispatcher
  enabled: true
  paths:
    - /work/logs/output.log
output.logstash:
  hosts: ["logstash:5044"]

filebeat.yml的參考配置:

#=========================== Filebeat inputs =============================

filebeat.inputs:

- type: log
  enabled: true     #默認為false,修改為true則啟用該配置
  paths:
    - /home/logs/*.log
  fields:
    filetype: test1    #自定義字段,用來區分多個類型日志
  fields_under_root: true    #如果該選項設置為true,則新增fields成為頂級目錄,而不是將其放在fields目錄下

#============================= Filebeat modules ===============================

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

#==================== Elasticsearch template setting ==========================

setup.template.settings:
  index.number_of_shards: 1
  #index.codec: best_compression
  #_source.enabled: false

#================================ Outputs =====================================
#直接將log數據傳輸到Elasticsearch
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]
  username: "elastic"
  password: "elastic"

#----------------------------- Logstash output --------------------------------#將log數據傳輸到logstash#先啟動logstash,不然的話filebeat會找不到logstash的5044端口
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

message-dispatcher微服務的filebeat.yml配置:

主要配置的是日志的搜集目錄為/work/logs/output.log,這個目錄是應用message-dispatcher輸出日志的文件。

由於其他的微服務也是固定在這個 文件,

在這里插入圖片描述

所以這個路徑,基本可以固定。

message-dispatcher微服務的filebeat.yml配置:

輸出到logstsh的地址為logstash,這里用的是容器的名稱, logstash和 這個微服務,需要在同一個網絡。

如果不是,可以使用虛擬機的名稱,然后把 5044,映射到15044

filebeat.inputs:
- type: message-dispatcher
  enabled: true
  paths:
    - /work/logs/output.log
output.logstash:
  hosts: ["cdh2:15044"]

啟動filebeat,執行一下命令:

nohup  /user/local/filebeat-7.14.0-linux-x86_64/filebeat  -c /work/filebeat/filebeat.yaml   >> /work/filebeat/out.log 2>&1  &

修改message-dispatcher的dockerfile

#FROM nien/openjdk:8-jre-alpine3.9-bash
FROM  nien/filebeat:7.14.0

# 指定維護者的信息
MAINTAINER 尼恩@瘋狂創客圈


ADD dispatcher-provider-1.0-SNAPSHOT.jar  /app/message-dispatcher.jar
ADD deploy-sit.sh  /app/run.sh
RUN chmod +x /app/run.sh

# WORKDIR /app/

ENTRYPOINT /bin/bash -c  "/app/run.sh start"
# ENTRYPOINT /bin/bash 

一鍵發布message-dispatcher


mkdir -p  /home/docker-compose/sit-ware/message-dispatcher

cd /home/docker-compose/sit-ware/message-dispatcher

docker-compose down
 
docker image  rm message-dispatcher:1.0-SNAPSHOT

rm -rf  /home/docker-compose/sit-ware/message-dispatcher

cp -rf /vagrant/sit-ware/message-dispatcher  /home/docker-compose/sit-ware


cd /home/docker-compose/sit-ware

chmod 777 -R  message-dispatcher

cd message-dispatcher

docker-compose --compatibility  up  -d

docker-compose  logs -f


docker-compose down

mysql/5.7.31

docker save mysql:5.7.31  -o /vagrant/3G-middleware/mysql.5.7.31.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5        -o /vagrant/3G-middleware/canal-server.v1.1.5.tar

docker save registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5        -o /vagrant/3G-middleware/canal-admin.v1.1.5.tar


docker exec -it message-dispatcher /bin/bash

tail -f /work/filebeat/out.log 


java -server -Xms64m -Xmx256m   -Dserver.port=7790 -Dspring.profiles.active=sit  -jar  /vagrant/sit-ware/springcloud-gateway/springcloud-gateway-1.0-SNAPSHOT.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication


java -server -Xms64m -Xmx256m -javaagent: -Dskywalking.agent.service_name=springcloud-gateway -Dskywalking.collector.backend_service=127.0.0.1  -Dserver.port=7790 -Dspring.profiles.active=sit  -jar /app/springcloud-gateway.jar com.crazymaker.cloud.nacos.demo.gateway.starter.GatewayProviderApplication

啟動之后

spatcher    | ----------------------------------------------------------
message-dispatcher    |         UAA 推送中台 push-provider is running! Access URLs:
message-dispatcher    |         Local:          http://127.0.0.1:7703/message-dispatcher-provider/
message-dispatcher    |         swagger-ui:     http://127.0.0.1:7703/message-dispatcher-provider/swagger-ui.html
message-dispatcher    |         actuator:       http://127.0.0.1:7703/message-dispatcher-provider/actuator/info
message-dispatcher    |         ----------------------------------------------------------
message-di

http://cdh2:7703/message-dispatcher-provider/swagger-ui.html

message-dispatcher微服務的日志

在SpringBoot應用message-dispatcher微服務的日志,輸出日志如下:

[root@cdh2 filebeat]# cd  /home/docker-compose/sit-ware/message-dispatcher/work/logs/
[root@cdh2 logs]# cat output.log
2022-04-02 09:03:30.103 [background-preinit] DEBUG o.h.v.m.ResourceBundleMessageInterpolator:89 - Loaded expression factory via original TCCL
2022-04-02 09:03:59.633 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$e81692de] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-04-02 09:04:05.331 [main] INFO  c.a.n.client.config.impl.LocalConfigInfoProcessor:195 - LOCAL_SNAPSHOT_PATH:/root/nacos/config
2022-04-02 09:04:06.034 [main] INFO  com.alibaba.nacos.client.config.impl.Limiter:53 - limitTime:5.0
2022-04-02 09:04:06.899 [main] INFO  com.alibaba.nacos.client.config.utils.JVMUtil:47 - isMultiInstance:false
2022-04-02 09:04:07.068 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder:87 - Ignore the empty nacos configuration and get it based on dataId[message-dispatcher-provider] & group[DEFAULT_GROUP]
2022-04-02 09:04:07.100 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder:87 - Ignore the empty nacos configuration and get it based on dataId[message-dispatcher-provider.yml] & group[DEFAULT_GROUP]
2022-04-02 09:04:07.191 [main] INFO  o.s.c.b.c.PropertySourceBootstrapConfiguration:101 - Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='message-dispatcher-provider-sit.yml,DEFAULT_GROUP'}, NacosPropertySource {name='message-dispatcher-provider.yml,DEFAULT_GROUP'}, NacosPropertySource {name='message-dispatcher-provider,DEFAULT_GROUP'}, NacosPropertySource {name='sharding-db-dev.yml,DEFAULT_GROUP'}]}
2022-04-02 09:04:07.304 [main] INFO  c.c.s.message.start.MessageDispatchApplication:652 - The following profiles are active: sit
2022-04-02 09:04:28.417 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate:247 - Multiple Spring Data modules found, entering strict repository configuration mode!
2022-04-02 09:04:28.418 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate:127 - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2022-04-02 09:04:34.251 [main] INFO  o.s.d.r.config.RepositoryConfigurationDelegate:185 - Finished Spring Data repository scanning in 5673ms. Found 3 JPA repository interfaces.
2022-04-02 09:04:37.630 [main] WARN  o.springframework.boot.actuate.endpoint.EndpointId:131 - Endpoint ID 'nacos-config' contains invalid characters, please migrate to a valid format.
2022-04-02 09:07:17.969 [main] ERROR org.springframework.boot.SpringApplication:823 - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messagePushServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rocketmqMessageService' defined in URL [jar:file:/app/message-dispatcher.jar!/BOOT-INF/classes!/com/crazymaker/springcloud/message/service/impl/RocketmqMessageService.class]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: org.apache.rocketmq.remoting.exception.RemotingTimeoutException: wait response on the channel <dh2/192.168.56.122:9876> timeout, 3000(ms)
        at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:325)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1404)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)

然后在部署了filebeat的機器上部署該應用,應用的輸出文件為/var/log/service-hi.log,應用啟動命令如下:

1 nohup java -jar  elk-test-0.0.1-SNAPSHOT.jar > /var/log/service-hi.log 2>&1  &

應用啟動成功后日志輸出如下:

1 2019-07-02 17:13:13.530  INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication   : seed:562779
2 2019-07-02 17:13:13.630  INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication   : seed:963836
3 2019-07-02 17:13:13.730  INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication   : seed:825694
4 2019-07-02 17:13:13.830  INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication   : seed:33228
5 2019-07-02 17:13:13.930  INFO 31579 --- [pool-1-thread-1] com.example.elktest.ElkTestApplication   : seed:685589

這時的日志數據的傳輸路徑如下圖:

img

查看日志索引

docker run --name filebeat -d  \
-v /home/qw/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /home/qw/elk/testlog/:/home/ \
 elastic/filebeat:7.2.0

效果

在這里插入圖片描述

可以看到 在kibana中多了兩個索引
需要配置

在這里插入圖片描述
創建一個
在這里插入圖片描述
選擇
在這里插入圖片描述
最終展示

在這里插入圖片描述
到這里簡單收集日志就完成了,需要更多復雜業務配置,需要大家根據需求自己配置詳細信息.

es的安全認證

通常搭建的elk默認是不需要身份認證,這樣就會把數據暴露在外網,因此會顯得非常危險。下面我們介紹如何為es加入身份認證
es身份認證參考鏈接

切記,這里 修改es 配置文件和 啟動es的二進制文件的時候 一定要用es系統用戶不要用ubuntu或root用戶操作。不然會報錯。

配置了 安全認證后 logstash + filebeat +es +kibfana 都需要在配置文件中 加入 訪問的賬號密碼來認證。
logstash 配置文件

elasticsearch {
      hosts => ["ip:9200"]
      user => elastic  --加入es用戶
      password => xxxx   --加入es密碼
      index => "test-%{+YYYY-MM-dd}"
      timeout => 300
  }

kibfana 配置文件
配置 Kibana 以使用內置 kibana 用戶和您創建的密碼

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"
i18n.locale: "zh-CN"  --配置 kibana 顯示中文
elasticsearch.username: "kibana"   --加入kibana 賬戶
elasticsearch.password: "123456"   --加入kibana 賬戶的密碼 

說明:本文會以pdf格式持續更新,更多最新尼恩3高pdf筆記,請從下面的鏈接獲取:語雀 或者 碼雲

配置 elk的ElastAlert 預警插件

我們都知道 elk架構 是收集與分析 集群的日志 方便開發排錯但是 預警功能是缺一不可的,如果開發人員不能及時查看線上錯誤日式,這個時候 就需要我們的預警插件來實現實時推送告警。
ElastAlert : 是python開發一個插件因此需要配合python運行環境和python-pip 包管理工具,以及相關依賴包

1.安裝相關依賴包

yum -y install openssl openssl-devel gcc gcc-c++  --centos系統安裝方式
--ubuntu 安裝方式
sudo apt-get install openssl  --openssl依賴包
sudo apt-get install libssl-dev  --openssl-devel 依賴包 
sudo apt-get  install  build-essential   --gcc 依賴包 注意:gcc和g++版本必須一致
sudo apt-get install g++ 7.4  --g++ 依賴包 
g++ --version --查看版本
gcc --version
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz --下載二進制python源碼

2.安裝python運行環境

tar xf Python-3.6.9.tgz
cd Python-3.6.9./configure --prefix=/usr/local/python --with-openssl
make && make install  --編譯源碼

配置

mv /usr/bin/python /usr/bin/python_old  //把ubuntu自帶的python2.7環境移出到另外一個文件夾
ln -s /usr/local/python/bin/python3 /usr/bin/python  //建立python軟鏈接
ln -s /usr/local/python/bin/pip3 /usr/bin/pip  //建立pip軟鏈接
pip install --upgrade pip //此處沒有安裝pip的需要去安裝pip
sudo apt install python3-pip //安裝pip3.0版本 對應了python 3.6.9版本
//此處我沒有動ubuntu自帶的python2.7版本的 因此我們使用新的python使用3.6.9時,按以下方式使用:
python3.6 --version
python2.7 --version
pip3 --version
//使用python和pip命令時 都改為 python3.6與pip3

到此python環境配置完成

3.安裝elastalert

下載源碼

git clone https://github.com/Yelp/elastalert.git //下載 源碼
cd elastalert
pip3 install "elasticsearch<8,>7"    
//因為我們的es是7.4.0,所以這里選用的版本是這個
pip3 install -r requirements.txt 用pip安裝依賴

安裝成功時候 /usr/local/python/bin/目錄下會有四個文件

ls /usr/local/python/bin/elastalert* 或者這個目錄下
ls /usr/local/bin/elastalert*

在這里插入圖片描述

ln -s /usr/local/python/bin/elastalert* /usr/bin  //建立軟鏈接把這四個命令鏈接到bin目錄下

4. 配置ElastAlert
配置config.yaml 文件 (創建)

cp config.yaml.example  config.yaml 
sudo vi config.yaml

在這里插入圖片描述

rules_folder:ElastAlert從中加載規則配置文件的位置。它將嘗試加載文件夾中的每個.yaml文件。沒有任何有效規則,ElastAlert將無法啟動。
run_every: ElastAlert多久查詢一次Elasticsearch的時間。
buffer_time:查詢窗口的大小,從運行每個查詢的時間開始向后延伸。對於其中use_count_query或use_terms_query設置為true的規則,將忽略此值。
es_host:是Elasticsearch群集的地址,ElastAlert將在其中存儲有關其狀態,查詢運行,警報和錯誤的數據。
es_port:es對應的端口。
es_username: 可選的; 用於連接的basic-auth用戶名es_host。 es_password: 可選的; 用於連接的basic-auth密碼es_host。 es_send_get_body_as: 可選的; 方法查詢Elasticsearch - GET,POST或source。默認是GET writeback_index:ElastAlert將在其中存儲數據的索引的名稱。我們稍后將創建此索引。 alert_time_limit: 失敗警報的重試窗口。

創建elastalert-create-index索引 告警索引

$ elastalert-create-index
New index name (Default elastalert_status)
Name of existing index to copy (Default None)
New index elastalert_status created
Done!

5.配置Rule 告警規則配置
所有的告警規則,通過在example_rules目下創建配置文件進行定義,這里簡單創建一個來作為演示

name: Nginx_err  //規則名稱
use_strftine_index: true 
index: 10.0.0.153-system_cro-2020.11.18  //監聽查詢es的索引
type: any    //告警規則類型 有很多種 這種是 只要匹配到就觸發告警
aggregation:
 seconds: 1    //告警頻率
filter:
- query:
    query_string:
         query: "status:500 or status:404" //觸發報警的匹配條件 這里可以用kibana的語法去匹配
num_events: 1  //事件觸發次數 的貶值
timeframe:
  minutes: 1   //一分鍾內超過 num_envents觸發的次數 就觸發告警
alert:
 - "email"   //告警類型 此處是email 例如釘釘 企業微信
email_format: html  //email 正文格式
alert_subject: "正式環境Error告警"  //告警正文標題
alert_text_type: alert_text_only   //正文類型
alert_text: "<br><br><h3>告警詳情</h3><table><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>@timestamp:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>@version:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_id:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_index:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>ip:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>request:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td  style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>status:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>method:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>bytes:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>source:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>client_ip:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>httpversion:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr></table>"  //正文內容
alert_text_args:
 - "@timestamp"   //使用的是python的format格式動態填充數據
 - "@version"     //這些是屬性值 按順序對飲正文內容里面的 {} 
 - _id
 - _index
 - host.name
 - request
 - status
 - method
 - bytes
 - message
 - remote_ip
 - httpversion
email:
 - "xxx@xx.com"  //收件人 多個請依次往下填寫
 - "xxxx@qq.com"
 - "xxxx@xx.com"
smtp_host: smtp.mxhichina.com  //郵件服務器
smtp_port: 25   //郵件端口
smtp_auth_file: /home/ubuntu/elk/alert/elastalert/smtp_auth_file.yaml //此處新建了一個文件是 發件人的認證文件 存放發件人賬戶和密碼或授權碼
from_addr: haoyacong@gimmake.com  //發件人
email_reply_to: haoyacong@gimmake.com  //收件人標頭

運行ElastAlert

cd ElastAlert  //ElastAlert 的安裝目錄
python3.6 -m elastalert.elastalert --verbose --config config.yaml --rule ./example_rules/nginx_404.yaml  //指定告警規則文件  
nohup python3.6 -m elastalert.elastalert --verbose --config config.yaml --rule ./example_rules/nginx_404.yaml & //在后台運行
//如果運行多個告警規則執行多個上面的命令  如果執行example_rules下的全部規則文件 使用以下命令:
nohup python3.6 -m elastalert.elastalert --verbose --config config.yaml &

參考鏈接

參考鏈接

https://gitee.com/bison-fork/loki/blob/v2.2.1/production/docker-compose.yaml
SkyWalking官網 http://skywalking.apache.org/zh/
SkyWalking的docker github地址 https://github.com/apache/sky...
elasticsearch https://www.elastic.co/guide/...
skywalking中文文檔 https://skyapm.github.io/docu...
agent config https://github.com/apache/sky...
skywalking和其它agent一起使用的處理
https://zhuanlan.zhihu.com/p/163809795
https://www.cnblogs.com/you-men/p/14900249.html
https://cloud.tencent.com/developer/article/1684909
https://www.cnblogs.com/javaadu/p/11742605.html
https://www.jianshu.com/p/2fa99bd1997e
https://blog.csdn.net/weixin_42073629/article/details/106775584
https://www.cnblogs.com/kebibuluan/p/14466285.html
https://blog.csdn.net/weixin_42073629/article/details/106775584
https://blog.csdn.net/Jerry_wo/article/details/107937902
https://www.cnblogs.com/wzxmt/p/11031110.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM