企業級日誌平臺新秀 Graylog,比 ELK 輕量多了
當我們公司內部部署很多服務以及測試、正式環境的時候,查看日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後使用 Nginx
對外提供服務,還是使用專用的日誌收集服務 ELK
呢?這就變成了一個問題!而 Graylog
作爲整合方案,使用 elasticsearch
來存儲,使用 mongodb
來緩存,並且還有帶流量控制的 (throttling
),同時其界面查詢簡單易用且易於擴展。所以,使用 Graylog
成爲了不二之選,爲我們省了不少心。
- 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
的安裝部署方式多樣且運行十分穩定。
圖示服務架構理解記憶
- 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*"]
- Graylog 服務介紹
服務日誌收集方案:Filebeat + Graylog!
- [1] Graylog - 日誌監控系統
Graylog
是一個開源的日誌聚合、分析、審計、展現和預警工具。在功能上來說,和 ELK
類似,但又比 ELK
要簡單很多。依靠着更加簡潔,高效,部署使用簡單的優勢很快受到許多人的青睞。當然,在擴展性上面確實沒有比 ELK
好,但是其有商業版本可以選擇。
- [2] Graylog - 工作流程介紹
部署 graylog
最簡單的架構就是單機部署,複雜的也是部署集羣模式,架構圖示如下所示。我們可以看到其中包含了三個組件,分別是 Elasticsearch
、MongoDb
和 Graylog
。其中,Elasticsearch
用來持久化存儲和檢索日誌文件數據 (IO 密集),MongoDb
用來存儲關於 Graylog
的相關配置,而 Graylog
來提供 Web 界面和對外接口的 (CPU 密集)。
最小化單機部署
最優化集羣部署
- Graylog 組件功能
配置 Graylog 服務的核心就是理解對應組件的功能以及其運作方式!
簡單來講,Input
表示日誌數據的來源,對不同來源的日誌可以通過 Extractors
來進行日誌的字段轉換,比如將 Nginx
的狀態碼變成對應的英文表述等。然後,通過不同的標籤類型分組成不用的 Stream
,並將這些日誌數據存儲到指定的 Index
庫中進行持久化保存。
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
轉發到其它服務。
- 服務安裝和部署
主要介紹部署 Filebeat + Graylog 的安裝步驟和注意事項!
使用 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"]
使用 Graylog 來收集日誌
- [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
裏面了。
使用 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"
......
- Graylog 界面功能
主要介紹 Graylog 界面的相關功能和對應特點!
關注:fullstack888
學習架構知識
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/BkUSA-y3vHd2-xEvGKvewg