ELK 不香了!我用 Graylog,輕量多了...
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
作者:Escape
來(lái)源:www.escapelife.site/posts/38c81b25.html
服務(wù)日志收集方案:Filebeat + Graylog!
當(dāng)我們公司內(nèi)部部署很多服務(wù)以及測(cè)試、正式環(huán)境的時(shí)候,查看日志就變成了一個(gè)非常剛需的需求了。是多個(gè)環(huán)境的日志統(tǒng)一收集,然后使用 Nginx 對(duì)外提供服務(wù),還是使用專用的日志收集服務(wù) ELK 呢?
這就變成了一個(gè)問(wèn)題!而 Graylog 作為整合方案,使用 elasticsearch 來(lái)存儲(chǔ),使用 mongodb 來(lái)緩存,并且還有帶流量控制的 (throttling),同時(shí)其界面查詢簡(jiǎn)單易用且易于擴(kuò)展。
所以,使用 Graylog 成為了不二之選,為我們省了不少心。

1. Filebeat 工具介紹
服務(wù)日志收集方案:Filebeat + Graylog!
[1] Filebeat - 日志文件托運(yùn)服務(wù)
Filebeat 是一個(gè)日志文件托運(yùn)工具,在你的服務(wù)器上安裝客戶端后,filebeat 會(huì)自動(dòng)監(jiān)控給定的日志目錄或者指定的日志文件,追蹤讀取這些文件,不停的讀取,并且轉(zhuǎn)發(fā)這些信息到 elasticsearch 或者 logstarsh 或者 graylog 中存放。
[2] Filebeat - 工作流程介紹
當(dāng)你安裝并啟用 filebeat 程序的時(shí)候,它會(huì)啟動(dòng)一個(gè)或多個(gè)探測(cè)器(prospectors)去檢測(cè)你指定的日志目錄或文件,對(duì)于探測(cè)器找出的每一個(gè)日志文件,filebeat 都會(huì)啟動(dòng)一個(gè)收割進(jìn)程(harvester),每一個(gè)收割進(jìn)程讀取一個(gè)日志文件的最新內(nèi)容,并發(fā)送這些新的日志數(shù)據(jù)到處理程序(spooler),處理程序會(huì)集合這些事件,最后 filebeat 會(huì)發(fā)送集合的數(shù)據(jù)到你指定的地址上去(我們這里就是發(fā)送給graylog服務(wù)了)。
[3] Filebeat - 圖示理解記憶
我們這里不適用 logstash 服務(wù),主要是因?yàn)?filebeat 相比于 logstash 更加輕量級(jí)。當(dāng)我們需要收集信息的機(jī)器配置或資源并不是特別多時(shí),且并沒(méi)有那么復(fù)雜的時(shí)候,還是建議使用 filebeat 來(lái)收集日志。日常使用中,filebeat 的安裝部署方式多樣且運(yùn)行十分穩(wěn)定。

2. Filebeat 配置文件
配置 Filebeat 工具的核心就是如何編寫其對(duì)應(yīng)的配置文件!
對(duì)應(yīng) Filebeat 工具的配置主要是通過(guò)編寫其配置文件來(lái)控制的,對(duì)于通過(guò) rpm 或者 deb 包來(lái)安裝的情況,配置文件默認(rèn)會(huì)存儲(chǔ)在,/etc/filebeat/filebeat.yml 這個(gè)路徑下面。而對(duì)于,對(duì)于 MAC 或者 Win 系統(tǒng)來(lái)說(shuō),請(qǐng)查看解壓文件中相關(guān)文件,其中都有涉及。
下面展示了 Filebeat 工具的主配置文件,注釋信息中都對(duì)其各個(gè)字段含義進(jìn)行了詳細(xì)的解釋,我這里就不再贅述了。需要注意的是,我們將日志的輸入來(lái)源統(tǒng)統(tǒng)定義去讀取 inputs.d 目錄下的所有 yml 配置。
所以,我們可以更加不用的服務(wù)(測(cè)試、正式服務(wù))來(lái)定義不同的配置文件,根據(jù)物理機(jī)部署的實(shí)際情況具體配置。
另外,最新面試題整理好了,大家可以在Java面試庫(kù)小程序在線刷題。
#?配置輸入來(lái)源的日志信息
#?我們合理將其配置到了inputs.d目錄下的所有yml文件
filebeat.config.inputs:
??enabled:?true
??path:?${path.config}/inputs.d/*.yml
??#?若收取日志格式為json的log請(qǐng)開(kāi)啟此配置
??#?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ā)送那個(gè)地址上面
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ú)認(rèn)證的服務(wù)上Graylog服務(wù)發(fā)送數(shù)據(jù)
????????token:?"0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX?"下面展示一個(gè)簡(jiǎn)單的 inputs.d 目錄下面的 yml 配置文件的具體內(nèi)容,其主要作用就是配置單獨(dú)服務(wù)的獨(dú)立日志數(shù)據(jù),以及追加不同的數(shù)據(jù) tag 類型。
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
#?收集的數(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ù)標(biāo)簽
??tags:?["app",?"escape",?"test"]
??#?防止程序堆棧信息被分行識(shí)別
??multiline.pattern:?'^\[?[0-9]...{3}'
??multiline.negate:?true
??multiline.match:?after
#?需要配置多個(gè)日志時(shí)可加多個(gè)type字段
-?type:?log
??enabled:?true
??......
需要注意的是,針對(duì)于不同的日志類型,filebeat 還提供了不同了模塊來(lái)配置不同的服務(wù)日志以及其不同的模塊特性,比如我們常見(jiàn)的 PostgreSQl、Redis、Iptables 等。
推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice
#?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 是一個(gè)開(kāi)源的日志聚合、分析、審計(jì)、展現(xiàn)和預(yù)警工具。在功能上來(lái)說(shuō),和 ELK 類似,但又比 ELK 要簡(jiǎn)單很多。依靠著更加簡(jiǎn)潔,高效,部署使用簡(jiǎn)單的優(yōu)勢(shì)很快受到許多人的青睞。當(dāng)然,在擴(kuò)展性上面確實(shí)沒(méi)有比 ELK 好,但是其有商業(yè)版本可以選擇。
[2] Graylog - 工作流程介紹
部署 graylog 最簡(jiǎn)單的架構(gòu)就是單機(jī)部署,復(fù)雜的也是部署集群模式,架構(gòu)圖示如下所示。我們可以看到其中包含了三個(gè)組件,分別是 Elasticsearch、MongoDb 和 Graylog。
其中,Elasticsearch 用來(lái)持久化存儲(chǔ)和檢索日志文件數(shù)據(jù)(IO 密集),MongoDb 用來(lái)存儲(chǔ)關(guān)于 Graylog 的相關(guān)配置,而 Graylog 來(lái)提供 Web 界面和對(duì)外接口的(CPU 密集)。


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

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

[1] 部署 Filebeat 工具
官方提供了多種的部署方式,包括通過(guò) rpm 和 deb 包安裝服務(wù),以及源代碼編譯的方式安裝服務(wù),同時(shí)包括了使用 Docker 或者 kubernetes 的方式安裝服務(wù)。我們根據(jù)自己的實(shí)際需要,進(jìn)行安裝即可。
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
#?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啟動(dòng)
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 服務(wù)
我們這里主要介紹使用 Docker 容器來(lái)部署服務(wù),如果你需要使用其他方式來(lái)部署的話,請(qǐng)自行查看官方文檔對(duì)應(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登錄時(shí)所需要使用的密碼
$?echo?-n?"Enter?Password:?"?&&?head?-1?'\n'?|?sha256sum?|?cut?-d"?"?-f1
Enter?Password:?zscMb65...FxR9ag
77e29e0f...557515f
想成為架構(gòu)師,這份架構(gòu)師圖譜建議看看,少走彎路。
生成所需密碼信息之后,我們將如下 yml 信息保存到 docker-comopse.yml 文件中,使用 docker-compose 命令啟動(dòng)該服務(wù),即可完成部署。之后,通過(guò)瀏覽器訪問(wèn)對(duì)應(yīng)服務(wù)器地址的 9000 端口,即可登錄主頁(yè) 。
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ù)提供的訪問(wèn)端口
??????-?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ū)動(dòng)原生提供了 GELF 的支持。
只需要我們?cè)?Graylog 的 system/inputs 下面創(chuàng)建對(duì)應(yīng)的 input 之后,啟動(dòng)容器時(shí)候指定 log-driver,就可以將容器內(nèi)的輸出都會(huì)發(fā)送到 Graylog 里面了。
另外,最新面試題整理好了,大家可以在Java面試庫(kù)小程序在線刷題。

#?[docker]?啟動(dòng)容器指定地址和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]?啟動(dòng)使用方式
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)功能和對(duì)應(yīng)特點(diǎn)!





授人玫瑰,手有余香!
相關(guān)參考文章引用:
Filebeat 官方手冊(cè):https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Filebeat 中文指南:https://www.cnblogs.com/kerwinC/p/6227768.html
Graylog 集中日志系統(tǒng):https://medium.com/@doitian/graylog-集中日志系統(tǒng)-1f715bb7998c
Graylog2 采集 Nginx 日志 主動(dòng)方式:https://zhuanlan.zhihu.com/p/113761931
Graylog2 采集 Nginx 日志 主動(dòng)方式:https://zhuanlan.zhihu.com/p/113761931

關(guān)注Java技術(shù)棧看更多干貨


