作者:Escape 來源:https://www.escapelife.site/posts/38c81b25.html 服務日誌收集方案:Filebeat + Graylog! 當我們公司內部部署很多服務以及測試、正式環境的時候,查看日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後 ...
作者:Escape
來源:https://www.escapelife.site/posts/38c81b25.html
服務日誌收集方案:Filebeat + Graylog!
當我們公司內部部署很多服務以及測試、正式環境的時候,查看日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後使用 Nginx
對外提供服務,還是使用專用的日誌收集服務 ELK
呢?
這就變成了一個問題!而 Graylog
作為整合方案,使用 elasticsearch
來存儲,使用 mongodb
來緩存,並且還有帶流量控制的 (throttling
),同時其界面查詢簡單易用且易於擴展。
所以,使用 Graylog
成為了不二之選,為我們省了不少心。
1. Filebeat 工具介紹
服務日誌收集方案:Filebeat + Graylog!
[1] Filebeat - 日誌文件托運服務
Filebeat
是一個日誌文件托運工具,在你的伺服器上安裝客戶端後,filebeat
會自動監控給定的日誌目錄或者指定的日誌文件,追蹤讀取這些文件,不停的讀取,並且轉發這些信息到 elasticsearch
或者 logstarsh
或者 graylog
中存放。
[2] Filebeat - 工作流程介紹
當你安裝並啟用 filebeat
程式的時候,它會啟動一個或多個探測器(prospectors
)去檢測你指定的日誌目錄或文件,對於探測器找出的每一個日誌文件,filebeat
都會啟動一個收割進程(harvester
),每一個收割進程讀取一個日誌文件的最新內容,併發送這些新的日誌數據到處理程式(spooler
),處理程式會集合這些事件,最後 filebeat
會發送集合的數據到你指定的地址上去(我們這裡就是發送給graylog
服務了)。
[3] Filebeat - 圖示理解記憶
我們這裡不適用 logstash
服務,主要是因為 filebeat
相比於 logstash
更加輕量級。當我們需要收集信息的機器配置或資源並不是特別多時,且並沒有那麼複雜的時候,還是建議使用 filebeat
來收集日誌。日常使用中,filebeat
的安裝部署方式多樣且運行十分穩定。
2. Filebeat 配置文件
配置 Filebeat 工具的核心就是如何編寫其對應的配置文件!
對應 Filebeat
工具的配置主要是通過編寫其配置文件來控制的,對於通過 rpm
或者 deb
包來安裝的情況,配置文件預設會存儲在,/etc/filebeat/filebeat.yml
這個路徑下麵。而對於,對於 MAC
或者 Win
系統來說,請查看解壓文件中相關文件,其中都有涉及。
下麵展示了 Filebeat
工具的主配置文件,註釋信息中都對其各個欄位含義進行了詳細的解釋,我這裡就不再贅述了。需要註意的是,我們將日誌的輸入來源統統定義去讀取 inputs.d
目錄下的所有 yml
配置。所以,我們可以更加不用的服務(測試、正式服務)來定義不同的配置文件,根據物理機部署的實際情況具體配置。
# 配置輸入來源的日誌信息
# 我們合理將其配置到了inputs.d目錄下的所有yml文件
filebeat.config.inputs:
enabled: true
path: ${path.config}/inputs.d/*.yml
# 若收取日誌格式為json的log請開啟此配置
# json.keys_under_root: true
# 配置filebeat需要載入的模塊
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
# 配置將日誌信息發送那個地址上面
output.logstash:
hosts: ["11.22.33.44:5500"]
# output.file:
# enable: true
processors:
- add_host_metadata: ~
- rename:
fields:
- from: "log"
to: "message"
- add_fields:
target: ""
fields:
# 加token是為了防止無認證的服務上Graylog服務發送數據
token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "
下麵展示一個簡單的 inputs.d
目錄下麵的 yml
配置文件的具體內容,其主要作用就是配置單獨服務的獨立日誌數據,以及追加不同的數據 tag
類型。
# 收集的數據類型
- type: log
enabled: true
# 日誌文件的路徑地址
paths:
- /var/log/supervisor/app_escape_worker-stderr.log
- /var/log/supervisor/app_escape_prod-stderr.log
symlinks: true
# 包含的關鍵字信息
include_lines: ["WARNING", "ERROR"]
# 打上數據標簽
tags: ["app", "escape", "test"]
# 防止程式堆棧信息被分行識別
multiline.pattern: '^\[?[0-9]...{3}'
multiline.negate: true
multiline.match: after
# 需要配置多個日誌時可加多個type欄位
- type: log
enabled: true
......
需要註意的是,針對於不同的日誌類型,filebeat
還提供了不同了模塊來配置不同的服務日誌以及其不同的模塊特性,比如我們常見的 PostgreSQl
、Redis
、Iptables
等。
# iptables
- module: iptables
log:
enabled: true
var.paths: ["/var/log/iptables.log"]
var.input: "file"
# postgres
- module: postgresql
log:
enabled: true
var.paths: ["/path/to/log/postgres/*.log*"]
# nginx
- module: nginx
access:
enabled: true
var.paths: ["/path/to/log/nginx/access.log*"]
error:
enabled: true
var.paths: ["/path/to/log/nginx/error.log*"]
3. Graylog 服務介紹
服務日誌收集方案:Filebeat + Graylog!
[1] Graylog - 日誌監控系統
Graylog
是一個開源的日誌聚合、分析、審計、展現和預警工具。在功能上來說,和 ELK
類似,但又比 ELK
要簡單很多。依靠著更加簡潔,高效,部署使用簡單的優勢很快受到許多人的青睞。當然,在擴展性上面確實沒有比 ELK
好,但是其有商業版本可以選擇。
[2] Graylog - 工作流程介紹
部署 graylog
最簡單的架構就是單機部署,複雜的也是部署集群模式,架構圖示如下所示。我們可以看到其中包含了三個組件,分別是 Elasticsearch
、MongoDb
和 Graylog
。其中,Elasticsearch
用來持久化存儲和檢索日誌文件數據(IO 密集),MongoDb
用來存儲關於 Graylog
的相關配置,而 Graylog
來提供 Web 界面和對外介面的(CPU 密集)。
4. Graylog 組件功能
配置 Graylog 服務的核心就是理解對應組件的功能以及其運作方式!
簡單來講,Input
表示日誌數據的來源,對不同來源的日誌可以通過 Extractors
來進行日誌的欄位轉換,比如將 Nginx
的狀態碼變成對應的英文表述等。然後,通過不同的標簽類型分組成不用的 Stream
,並將這些日誌數據存儲到指定的 Index
庫中進行持久化保存。
編號 | 組件名稱 | 功能介紹 | 主要特點 |
---|---|---|---|
1 | Dashboards |
數據面板固定展示 | 主要是用來保存特定搜索條件的數據面板 |
2 | Searching |
日誌信息條件搜索 | 關鍵字搜索、時間搜索、搜索保存、創建面板、分組查詢、結果導出、查詢高亮顯示、自定義時間 |
3 | Alert |
設置告警提示方式 | 支持郵件告警、HTTP 回調和自定義腳本觸發 |
4 | Inputs |
日誌數據抓取接收 | 部署 Sidercar 主動抓取或使用其他服務被動上報 |
5 | Extractors |
日誌數據格式轉換 | json 解析、kv 解析、時間戳解析、正則解析 |
6 | Streams |
日誌信息分類分組 | 設置日誌分類條件併發送到不同的索引文件中去 |
7 | Indices |
持久化數據存儲 | 設置數據存儲性能 |
8 | Outputs |
日誌數據的轉發 | 解析的 Stream 發送到其他 Graylog 集群或服務 |
9 | Pipelines |
日誌數據的過濾 | 建立數據清洗的過濾規則、欄位添加刪除、條件過濾、自定義函數等 |
10 | Sidecar |
輕量級的日誌採集器 | 相當於 C/S 模式;大規模時使用 |
11 | Lookup Tables |
服務解析 | 基於 IP 的 Whois 查詢和基於來源 IP 的情報監控 |
12 | Geolocation |
可視化地理位置 | 實現基於來源 IP 的情報監控 |
Graylog中的核心服務組件
Graylog
通過 Input
搜集日誌,每個 Input
單獨配置 Extractors
用來做欄位轉換。Graylog
中日誌搜索的基本單位是 Stream
,每個 Stream
可以有自己單獨的 Elastic Index Set
,也可以共用一個 Index Set
。
Extractor
在 System/Input
中配置。Graylog
中很方便的一點就是可以載入一條日誌,然後基於這個實際的例子進行配置並能直接看到結果。內置的 Extractor
基本可以完成各種欄位提取和轉換的任務,但是也有些限制,在應用里寫日誌的時候就需要考慮到這些限制。Input
可以配置多個 Extractors
,按照順序依次執行。
系統會有一個預設的 Stream
,所有日誌預設都會保存到這個 Stream
中,除非匹配了某個 Stream
,並且這個 Stream
里配置了不保存日誌到預設 Stream
。可以通過菜單 Streams
創建更多的 Stream
,新創建的 Stream
是暫停狀態,需要在配置完成後手動啟動。Stream
通過配置條件匹配日誌,滿足條件的日誌添加 stream ID
標識欄位並保存到對應的 Elastic Index Set
中。
Index Set
通過菜單 System/Indices
創建。日誌存儲的性能,可靠性和過期策略都通過 Index Set
來配置。性能和可靠性就是配置 Elastic Index
的一些參數,主要參數包括,Shards
和 Replicas
。
除了上面提到的日誌處理流程,Graylog
還提供了 Pipeline
腳本實現更靈活的日誌處理方案。這裡不詳細闡述,只介紹如果使用 Pipelines
來過濾不需要的日誌。下麵是丟棄 level > 6
的所有日誌的 Pipeline Rule
的例子。從數據採集(input
),欄位解析(extractor
),分流到 stream
,再到 pipeline
的清洗,一氣呵成,無需在通過其他方式進行二次加工。
Sidecar
是一個輕量級的日誌採集器,通過訪問 graylog
進行集中式管理,支持 linux
和 windows
系統。Sidecar
守護進程會定期訪問 graylog
的 REST API
介面獲取 Sidecar
配置文件中定義的標簽(tag
) ,Sidecar
在首次運行時會從 graylog
伺服器拉取配置文件中指定標簽(tag
) 的配置信息同步到本地。
目前 Sidecar
支持 NXLog
,Filebeat
和 Winlogbeat
。他們都通過 graylog
中的 web
界面進行統一配置,支持 Beats
、CEF
、Gelf
、Json API
、NetFlow
等輸出類型。Graylog
最厲害的在於可以在配置文件中指定 Sidecar
把日誌發送到哪個 graylog
群集,並對 graylog
群集中的多個 input
進行負載均衡,這樣在遇到日誌量非常龐大的時候,graylog
也能應付自如。
rule "discard debug messages"
when
to_long($message.level) > 6
then
drop_message();
end
日誌集中保存到 Graylog
後就可以方便的使用搜索了。不過有時候還是需要對數據進行近一步的處理。主要有兩個途徑,分別是直接訪問 Elastic
中保存的數據,或者通過 Graylog
的 Output
轉發到其它服務。
5. 服務安裝和部署
主要介紹部署 Filebeat + Graylog 的安裝步驟和註意事項!
[1] 部署 Filebeat 工具
官方提供了多種的部署方式,包括通過 rpm
和 deb
包安裝服務,以及源代碼編譯的方式安裝服務,同時包括了使用 Docker
或者 kubernetes
的方式安裝服務。我們根據自己的實際需要,進行安裝即可。
# Ubuntu(deb)
$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-amd64.deb
$ sudo dpkg -i filebeat-7.8.1-amd64.deb
$ sudo systemctl enable filebeat
$ sudo service filebeat start
# 使用docker啟動
docker run -d --name=filebeat --user=root \
--volume="./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
--volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
docker.elastic.co/beats/filebeat:7.8.1 filebeat -e -strict.perms=false \
-E output.elasticsearch.hosts=["elasticsearch:9200"]
[2] 部署 Graylog 服務
我們這裡主要介紹使用 Docker
容器來部署服務,如果你需要使用其他方式來部署的話,請自行查看官方文檔對應章節的安裝部署步驟。在服務部署之前,我們需要給 Graylog
服務生成等相關信息,生成部署如下所示:
# 生成password_secret密碼(最少16位)
$ sudo apt install -y pwgen
$ pwgen -N 1 -s 16
zscMb65...FxR9ag
# 生成後續Web登錄時所需要使用的密碼
$ echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
Enter Password: zscMb65...FxR9ag
77e29e0f...557515f
生成所需密碼信息之後,我們將如下 yml
信息保存到 docker-comopse.yml
文件中,使用 docker-compose
命令啟動該服務,即可完成部署。之後,通過瀏覽器訪問對應伺服器地址的 9000
埠,即可登錄主頁 。
version: "3"
services:
mongo:
restart: on-failure
container_name: graylog_mongo
image: "mongo:3"
volumes:
- "./mongodb:/data/db"
networks:
- graylog_network
elasticsearch:
restart: on-failure
container_name: graylog_es
image: "elasticsearch:6.8.5"
volumes:
- "./es_data:/usr/share/elasticsearch/data"
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx5120m"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 12g
networks:
- graylog_network
graylog:
restart: on-failure
container_name: graylog_web
image: "graylog/graylog:3.3"
ports:
- 9000:9000 # Web服務提供的訪問埠
- 5044:5044 # Filebeat工具提供埠
- 12201:12201 # GELF TCP
- 12201:12201/udp # GELF UDP
- 1514:1514 # Syslog TCP
- 1514:1514/udp # Syslog UDP
volumes:
- "./graylog_journal:/usr/share/graylog/data/journal"
environment:
- GRAYLOG_PASSWORD_SECRET=zscMb65...FxR9ag
- GRAYLOG_ROOT_PASSWORD_SHA2=77e29e0f...557515f
- GRAYLOG_HTTP_EXTERNAL_URI=http://11.22.33.44:9000/
- GRAYLOG_TIMEZONE=Asia/Shanghai
- GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
networks:
- graylog
depends_on:
- mongo
- elasticsearch
networks:
graylog_network:
driver: bridge
需要註意的是,GELF
(Graylog Extended Log Format
) 的 input
模式可以接受結構化的事件,支持壓縮和分塊。恰好,Docker
服務的 log-driver
驅動原生提供了 GELF
的支持。只需要我們在 Graylog
的 system/inputs
下麵創建對應的 input
之後,啟動容器時候指定 log-driver
,就可以將容器內的輸出都會發送到 Graylog
裡面了。
# [docker] 啟動容器指定地址和driver
docker run --rm=true \
--log-driver=gelf \
--log-opt gelf-address=udp://11.22.33.44:12201 \
--log-opt tag=myapp \
myapp:0.0.1
# [docker-compose] 啟動使用方式
version: "3"
services:
redis:
restart: always
image: redis
container_name: "redis"
logging:
driver: gelf
options:
gelf-address: udp://11.22.33.44:12201
tag: "redis"
......
6. Graylog 界面功能
主要介紹 Graylog 界面的相關功能和對應特點!
授人玫瑰,手有餘香!
相關參考文章引用:
Filebeat 官方手冊:https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Filebeat 中文指南:https://www.cnblogs.com/kerwinC/p/6227768.html
Graylog 集中日誌系統:https://medium.com/@doitian/graylog-集中日誌系統-1f715bb7998c
Graylog2 採集 Nginx 日誌 主動方式:https://zhuanlan.zhihu.com/p/113761931
Graylog2 採集 Nginx 日誌 主動方式:https://zhuanlan.zhihu.com/p/113761931
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
覺得不錯,別忘了隨手點贊+轉發哦!