文章很長,而且持續更新,建議收藏起來,慢慢讀!瘋狂創客圈總目錄 博客園版 為您奉上珍貴的學習資源 :
免費贈送 :《尼恩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
一鍵安裝 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"}
增加數據源
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
訪問
kibana
基礎環境
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:隨從端口:選舉端口;客戶端口
其中x
為ZOO.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~3 台服務器網絡可以ping通
- 確保第一台主機的2181\2888\3888端口未占用,第二台主機的2182\2889\3889端口未占用,第三台主機的2183\2890\3890端口未占用
- 復制zk-01到第一台主機、復制zk-02到第二台主機、復制zk-03到第三台主機
- 修改.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的關系
- Logstash可以將數據收集起來統一刷入Elasticsearch中
- 數據在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
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。 輸入插件使用來自源的數據,過濾器插件在您指定時修改數據,輸出插件將數據寫入目標。
如下圖
根據官方文檔Logstash對數據的處理主要流程是
- 首先數據傳入logstash,在其內部對數據進行過濾和處理
- logstash將處理過的數據傳遞給Elasticsearch
- Elasticsearch對數據進行存儲、創建索引等內容
- 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 通用選項,用於輸入數據的編解碼器。
數據處理環節
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字段中。如果不指定將存儲在根目錄中
數據輸出
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開頭的數據索引,如下圖:
在日志搜索界面,可以看到service-hi應用輸出的日志,如圖所示:
啟動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
一鍵安裝 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
訪問kibana
kibana
使用filebeat發送日志
filebeat介紹
Filebeat是一個輕量級日志傳輸Agent,可以將指定日志轉發到Logstash、Elasticsearch、Kafka、Redis等中。Filebeat占用資源少,而且安裝配置也比較簡單,支持目前各類主流OS及Docker平台。
Filebeat是用於轉發和集中日志數據的輕量級傳送程序。作為服務器上的代理安裝,Filebeat監視您指定的日志文件或位置,收集日志事件,並將它們轉發到Elasticsearch或Logstash進行索引。
Filebeat的工作方式如下:啟動Filebeat時,它將啟動一個或多個輸入,這些輸入將在為日志數據指定的位置中查找。對於Filebeat所找到的每個日志,Filebeat都會啟動收集器。每個收割機都讀取一個日志以獲取新內容,並將新日志數據發送到libbeat,libbeat會匯總事件並將匯總的數據發送到您為Filebeat配置的輸出。
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啦
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
這時的日志數據的傳輸路徑如下圖:
查看日志索引
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 賬戶的密碼
配置 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