企業(yè)級日志平臺新秀Graylog,比ELK輕量多了~
作者:Escape
轉(zhuǎn)載:https://www.escapelife.site/posts/38c81b25.html
當我們公司內(nèi)部部署很多服務(wù)以及測試、正式環(huán)境的時候,查看日志就變成了一個非常剛需的需求了。是多個環(huán)境的日志統(tǒng)一收集,然后使用 Nginx 對外提供服務(wù),還是使用專用的日志收集服務(wù) ELK 呢?這就變成了一個問題!而 Graylog 作為整合方案,使用 elasticsearch 來存儲,使用 mongodb 來緩存,并且還有帶流量控制的 (throttling),同時其界面查詢簡單易用且易于擴展。所以,使用 Graylog 成為了不二之選,為我們省了不少心。
1. Filebeat 工具介紹
服務(wù)日志收集方案:Filebeat + Graylog!
[1] Filebeat - 日志文件托運服務(wù)
Filebeat 是一個日志文件托運工具,在你的服務(wù)器上安裝客戶端后,filebeat 會自動監(jiān)控給定的日志目錄或者指定的日志文件,追蹤讀取這些文件,不停的讀取,并且轉(zhuǎn)發(fā)這些信息到 elasticsearch 或者 logstarsh 或者 graylog 中存放。
[2] Filebeat - 工作流程介紹
當你安裝并啟用 filebeat 程序的時候,它會啟動一個或多個探測器(prospectors)去檢測你指定的日志目錄或文件,對于探測器找出的每一個日志文件,filebeat 都會啟動一個收割進程(harvester),每一個收割進程讀取一個日志文件的最新內(nèi)容,并發(fā)送這些新的日志數(shù)據(jù)到處理程序(spooler),處理程序會集合這些事件,最后 filebeat 會發(fā)送集合的數(shù)據(jù)到你指定的地址上去(我們這里就是發(fā)送給graylog服務(wù)了)。
[3] Filebeat - 圖示理解記憶
我們這里不適用 logstash 服務(wù),主要是因為 filebeat 相比于 logstash 更加輕量級。當我們需要收集信息的機器配置或資源并不是特別多時,且并沒有那么復(fù)雜的時候,還是建議使用 filebeat 來收集日志。日常使用中,filebeat 的安裝部署方式多樣且運行十分穩(wěn)定。

圖示服務(wù)架構(gòu)理解記憶
2. Filebeat 配置文件
配置 Filebeat 工具的核心就是如何編寫其對應(yīng)的配置文件!
對應(yīng) Filebeat 工具的配置主要是通過編寫其配置文件來控制的,對于通過 rpm 或者 deb 包來安裝的情況,配置文件默認會存儲在,/etc/filebeat/filebeat.yml 這個路徑下面。而對于,對于 MAC 或者 Win 系統(tǒng)來說,請查看解壓文件中相關(guān)文件,其中都有涉及。
下面展示了 Filebeat 工具的主配置文件,注釋信息中都對其各個字段含義進行了詳細的解釋,我這里就不再贅述了。需要注意的是,我們將日志的輸入來源統(tǒng)統(tǒng)定義去讀取 inputs.d 目錄下的所有 yml 配置。所以,我們可以更加不用的服務(wù)(測試、正式服務(wù))來定義不同的配置文件,根據(jù)物理機部署的實際情況具體配置。
# 配置輸入來源的日志信息
# 我們合理將其配置到了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
# 配置將日志信息發(fā)送那個地址上面
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是為了防止無認證的服務(wù)上Graylog服務(wù)發(fā)送數(shù)據(jù)
token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "下面展示一個簡單的 inputs.d 目錄下面的 yml 配置文件的具體內(nèi)容,其主要作用就是配置單獨服務(wù)的獨立日志數(shù)據(jù),以及追加不同的數(shù)據(jù) tag 類型。
# 收集的數(shù)據(jù)類型
- type: log
enabled: true
# 日志文件的路徑地址
paths:
- /var/log/supervisor/app_escape_worker-stderr.log
- /var/log/supervisor/app_escape_prod-stderr.log
symlinks: true
# 包含的關(guān)鍵字信息
include_lines: ["WARNING", "ERROR"]
# 打上數(shù)據(jù)標簽
tags: ["app", "escape", "test"]
# 防止程序堆棧信息被分行識別
multiline.pattern: '^\[?[0-9]...{3}'
multiline.negate: true
multiline.match: after
# 需要配置多個日志時可加多個type字段
- type: log
enabled: true
......需要注意的是,針對于不同的日志類型,filebeat 還提供了不同了模塊來配置不同的服務(wù)日志以及其不同的模塊特性,比如我們常見的 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 服務(wù)介紹
服務(wù)日志收集方案:Filebeat + Graylog!
[1] Graylog - 日志監(jiān)控系統(tǒng)
Graylog 是一個開源的日志聚合、分析、審計、展現(xiàn)和預(yù)警工具。在功能上來說,和 ELK 類似,但又比 ELK 要簡單很多。依靠著更加簡潔,高效,部署使用簡單的優(yōu)勢很快受到許多人的青睞。當然,在擴展性上面確實沒有比 ELK 好,但是其有商業(yè)版本可以選擇。
[2] Graylog - 工作流程介紹
部署 graylog 最簡單的架構(gòu)就是單機部署,復(fù)雜的也是部署集群模式,架構(gòu)圖示如下所示。我們可以看到其中包含了三個組件,分別是 Elasticsearch、MongoDb 和 Graylog。其中,Elasticsearch 用來持久化存儲和檢索日志文件數(shù)據(jù)(IO 密集),MongoDb 用來存儲關(guān)于 Graylog 的相關(guān)配置,而 Graylog 來提供 Web 界面和對外接口的(CPU 密集)。

最小化單機部署

最優(yōu)化集群部署
4. Graylog 組件功能
配置 Graylog 服務(wù)的核心就是理解對應(yīng)組件的功能以及其運作方式!
簡單來講,Input 表示日志數(shù)據(jù)的來源,對不同來源的日志可以通過 Extractors 來進行日志的字段轉(zhuǎn)換,比如將 Nginx 的狀態(tài)碼變成對應(yīng)的英文表述等。然后,通過不同的標簽類型分組成不用的 Stream,并將這些日志數(shù)據(jù)存儲到指定的 Index 庫中進行持久化保存。
| 編號 | 組件名稱 | 功能介紹 | 主要特點 |
|---|---|---|---|
| 1 | Dashboards | 數(shù)據(jù)面板固定展示 | 主要是用來保存特定搜索條件的數(shù)據(jù)面板 |
| 2 | Searching | 日志信息條件搜索 | 關(guān)鍵字搜索、時間搜索、搜索保存、創(chuàng)建面板、分組查詢、結(jié)果導(dǎo)出、查詢高亮顯示、自定義時間 |
| 3 | Alert | 設(shè)置告警提示方式 | 支持郵件告警、HTTP 回調(diào)和自定義腳本觸發(fā) |
| 4 | Inputs | 日志數(shù)據(jù)抓取接收 | 部署 Sidercar 主動抓取或使用其他服務(wù)被動上報 |
| 5 | Extractors | 日志數(shù)據(jù)格式轉(zhuǎn)換 | json 解析、kv 解析、時間戳解析、正則解析 |
| 6 | Streams | 日志信息分類分組 | 設(shè)置日志分類條件并發(fā)送到不同的索引文件中去 |
| 7 | Indices | 持久化數(shù)據(jù)存儲 | 設(shè)置數(shù)據(jù)存儲性能 |
| 8 | Outputs | 日志數(shù)據(jù)的轉(zhuǎn)發(fā) | 解析的 Stream 發(fā)送到其他 Graylog 集群或服務(wù) |
| 9 | Pipelines | 日志數(shù)據(jù)的過濾 | 建立數(shù)據(jù)清洗的過濾規(guī)則、字段添加刪除、條件過濾、自定義函數(shù)等 |
| 10 | Sidecar | 輕量級的日志采集器 | 相當于 C/S 模式;大規(guī)模時使用 |
| 11 | Lookup Tables | 服務(wù)解析 | 基于 IP 的 Whois 查詢和基于來源 IP 的情報監(jiān)控 |
| 12 | Geolocation | 可視化地理位置 | 實現(xiàn)基于來源 IP 的情報監(jiān)控 |

Graylog中的核心服務(wù)組件
Graylog 通過 Input 搜集日志,每個 Input 單獨配置 Extractors 用來做字段轉(zhuǎn)換。Graylog 中日志搜索的基本單位是 Stream,每個 Stream 可以有自己單獨的 Elastic Index Set,也可以共享一個 Index Set。
Extractor 在 System/Input 中配置。Graylog 中很方便的一點就是可以加載一條日志,然后基于這個實際的例子進行配置并能直接看到結(jié)果。內(nèi)置的 Extractor 基本可以完成各種字段提取和轉(zhuǎn)換的任務(wù),但是也有些限制,在應(yīng)用里寫日志的時候就需要考慮到這些限制。Input 可以配置多個 Extractors,按照順序依次執(zhí)行。
系統(tǒng)會有一個默認的 Stream,所有日志默認都會保存到這個 Stream 中,除非匹配了某個 Stream,并且這個 Stream 里配置了不保存日志到默認 Stream??梢酝ㄟ^菜單 Streams 創(chuàng)建更多的 Stream,新創(chuàng)建的 Stream 是暫停狀態(tài),需要在配置完成后手動啟動。Stream 通過配置條件匹配日志,滿足條件的日志添加 stream ID 標識字段并保存到對應(yīng)的 Elastic Index Set 中。
Index Set 通過菜單 System/Indices 創(chuàng)建。日志存儲的性能,可靠性和過期策略都通過 Index Set 來配置。性能和可靠性就是配置 Elastic Index 的一些參數(shù),主要參數(shù)包括,Shards 和 Replicas。
除了上面提到的日志處理流程,Graylog 還提供了 Pipeline 腳本實現(xiàn)更靈活的日志處理方案。這里不詳細闡述,只介紹如果使用 Pipelines 來過濾不需要的日志。下面是丟棄 level > 6 的所有日志的 Pipeline Rule 的例子。從數(shù)據(jù)采集(input),字段解析(extractor),分流到 stream,再到 pipeline 的清洗,一氣呵成,無需在通過其他方式進行二次加工。
Sidecar 是一個輕量級的日志采集器,通過訪問 graylog 進行集中式管理,支持 linux 和 windows 系統(tǒng)。Sidecar 守護進程會定期訪問 graylog 的 REST API 接口獲取 Sidecar 配置文件中定義的標簽(tag) ,Sidecar 在首次運行時會從 graylog 服務(wù)器拉取配置文件中指定標簽(tag) 的配置信息同步到本地。目前 Sidecar 支持 NXLog,Filebeat 和 Winlogbeat。他們都通過 graylog 中的 web 界面進行統(tǒng)一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等輸出類型。Graylog 最厲害的在于可以在配置文件中指定 Sidecar 把日志發(fā)送到哪個 graylog 群集,并對 graylog 群集中的多個 input 進行負載均衡,這樣在遇到日志量非常龐大的時候,graylog 也能應(yīng)付自如。
rule "discard debug messages"
when
to_long($message.level) > 6
then
drop_message();
end日志集中保存到 Graylog 后就可以方便的使用搜索了。不過有時候還是需要對數(shù)據(jù)進行近一步的處理。主要有兩個途徑,分別是直接訪問 Elastic 中保存的數(shù)據(jù),或者通過 Graylog 的 Output 轉(zhuǎn)發(fā)到其它服務(wù)。
5. 服務(wù)安裝和部署
主要介紹部署 Filebeat + Graylog 的安裝步驟和注意事項!

使用Graylog來收集日志
[1] 部署 Filebeat 工具
官方提供了多種的部署方式,包括通過 rpm 和 deb 包安裝服務(wù),以及源代碼編譯的方式安裝服務(wù),同時包括了使用 Docker 或者 kubernetes 的方式安裝服務(wù)。我們根據(jù)自己的實際需要,進行安裝即可。
# 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 服務(wù)
我們這里主要介紹使用 Docker 容器來部署服務(wù),如果你需要使用其他方式來部署的話,請自行查看官方文檔對應(yīng)章節(jié)的安裝部署步驟。在服務(wù)部署之前,我們需要給 Graylog 服務(wù)生成等相關(guān)信息,生成部署如下所示:
# 生成password_secret密碼(最少16位)
$ sudo apt install -y pwgen
$ pwgen -N 1 -s 16
zscMb65...FxR9ag
# 生成后續(xù)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 命令啟動該服務(wù),即可完成部署。之后,通過瀏覽器訪問對應(yīng)服務(wù)器地址的 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服務(wù)提供的訪問端口
- 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 模式可以接受結(jié)構(gòu)化的事件,支持壓縮和分塊。恰好,Docker 服務(wù)的 log-driver 驅(qū)動原生提供了 GELF 的支持。只需要我們在 Graylog 的 system/inputs 下面創(chuàng)建對應(yīng)的 input 之后,啟動容器時候指定 log-driver,就可以將容器內(nèi)的輸出都會發(fā)送到 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"
......6. Graylog 界面功能
主要介紹 Graylog 界面的相關(guān)功能和對應(yīng)特點!




- END -
推薦閱讀 31天拿下Kubernetes含金量最高的CKA+CKS證書! 最新Kubernetes實戰(zhàn)指南:從零到架構(gòu)師的進階之路 面試官:如果MySQL引起CPU消耗過大,你會怎么優(yōu)化? 面試數(shù)十家Linux運維工程師,總結(jié)了這些面試題(含答案) 記一次 Linux 被入侵,服務(wù)器變 “礦機”~ 七年老運維實戰(zhàn)中的 Shell 開發(fā)經(jīng)驗總結(jié) 快速入門 Ansible 自動化運維工具 | 16張圖 最強整理!常用正則表達式速查手冊 搭建一套完整的企業(yè)級 K8s 集群(v1.20,kubeadm方式) 12年資深運維老司機的成長感悟
點亮,服務(wù)器三年不宕機


