放棄 ELK!SpringBoot接入輕量級分布式日志框架GrayLog
當(dāng)我們公司內(nèi)部部署很多服務(wù)以及測試、正式環(huán)境的時候,查看日志就變成了一個非常剛需的需求了。
是多個環(huán)境的日志統(tǒng)一收集,然后使用 Nginx 對外提供服務(wù),還是使用專用的日志收集服務(wù) ELK 呢?這就變成了一個問題!
而 Graylog 作為整合方案,使用 Elasticsearch 來存儲,使用 MongoDB 來緩存,并且還有帶流量控制的(throttling),同時其界面查詢簡單易用且易于擴(kuò)展。所以,使用 Graylog 成為了不二之選,為我們省了不少心。
一、Filebeat 工具介紹
1.Filebeat 日志文件托運(yùn)服務(wù)
Filebeat 是一個日志文件托運(yùn)工具,在你的服務(wù)器上安裝客戶端后,F(xiàn)ilebeat 會自動監(jiān)控給定的日志目錄或者指定的日志文件,追蹤讀取這些文件,不停的讀取,并且轉(zhuǎn)發(fā)這些信息到 Elasticsearch 或者 Logstarsh 或者 Graylog 中存放。
2.Filebeat 工作流程介紹
當(dāng)你安裝并啟用 Filebeat 程序的時候,它會啟動一個或多個探測器(prospectors)去檢測你指定的日志目錄或文件。
對于探測器找出的每一個日志文件,F(xiàn)ilebeat 都會啟動一個收割進(jìn)程(harvester)。
每一個收割進(jìn)程讀取一個日志文件的最新內(nèi)容,并發(fā)送這些新的日志數(shù)據(jù)到處理程序(spooler),處理程序會集合這些事件。
最后 Filebeat 會發(fā)送集合的數(shù)據(jù)到你指定的地址上去(我們這里就是發(fā)送給 Graylog 服務(wù)了)。
3.Filebeat 圖示理解記憶
我們這里不適用 Logstash 服務(wù),主要是因?yàn)?Filebeat 相比于 Logstash 更加輕量級。
當(dāng)我們需要收集信息的機(jī)器配置或資源并不是特別多時,且并沒有那么復(fù)雜的時候,還是建議使用 Filebeat 來收集日志。
日常使用中,F(xiàn)ilebeat 的安裝部署方式多樣且運(yùn)行十分穩(wěn) 定。
圖示服務(wù)架構(gòu)理解記憶
二、Filebeat 配置文件
配置 Filebeat 工具的核心就是如何編寫其對應(yīng)的配置文件!
對應(yīng) Filebeat 工具的配置主要是通過編寫其配置文件來控制的,對于通過 rpm 或者 deb 包來安裝的情況,配置文件默認(rèn)會存儲在,/etc/filebeat/filebeat.yml 這個路徑下面。
而對于,對于 Mac 或者 Win 系統(tǒng)來說,請查看解壓文件中相關(guān)文件,其中都有涉及。
下面展示了 Filebeat 工具的主配置文件,注釋信息中都對其各個字段含義進(jìn)行了詳細(xì)的解釋,我這里就不再贅述了。
需要注意的是,我們將日志的輸入來源統(tǒng)統(tǒng)定義去讀取 inputs.d 目錄下的所有 yml 配置。
所以,我們可以更加不用的服務(wù)(測試、正式服務(wù))來定義不同的配置文件,根據(jù)物理機(jī)部署的實(shí)際情況具體配置。
# 配置輸入來源的日志信息# 我們合理將其配置到了 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: falsesetup.template.settings: index.number_of_shards: 1# 配置將日志信息發(fā)送那個地址上面output.logstash: hosts: ["11.22.33.44:5500"]# output.file:# enable: trueprocessors: - add_host_metadata: ~ - rename: fields: - from: "log" to: "message" - add_fields: target: "" fields: # 加 Token 是為了防止無認(rèn)證的服務(wù)上 Graylog 服務(wù)發(fā)送數(shù)據(jù) token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "
下面展示一個簡單的 inputs.d 目錄下面的 yml 配置文件的具體內(nèi)容,其主要作用就是配置單獨(dú)服務(wù)的獨(dú)立日志數(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ù)標(biāo)簽 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*"]
三、Graylog 服務(wù)介紹
1.Graylog 日志監(jiān)控系統(tǒng)
Graylog 日志監(jiān)控系統(tǒng)Graylog 是一個開源的日志聚合、分析、審計、展現(xiàn)和預(yù)警工具。在功能上來說,和 ELK 類似,但又比 ELK 要簡單很多。
依靠著更加簡潔,高效,部署使用簡單的優(yōu)勢很快受到許多人的青睞。當(dāng)然,在擴(kuò)展性上面確實(shí)沒有比 ELK 好,但是其有商業(yè)版本可以選擇。
2.Graylog 工作流程介紹
部署 Graylog 最簡單的架構(gòu)就是單機(jī)部署,復(fù)雜的也是部署集群模式,架構(gòu)圖示如下所示。
我們可以看到其中包含了三個組件,分別是 Elasticsearch、MongoDB 和 Graylog。
其中,Elasticsearch 用來持久化存儲和檢索日志文件數(shù)據(jù)(IO 密集),MongoDB 用來存儲關(guān)于 Graylog 的相關(guān)配置,而 Graylog 來提供 Web 界面和對外接口的(CPU 密集)。
最小化單機(jī)部署
最優(yōu)化集群部署
四、Graylog 組件功能
配置 Graylog 服務(wù)的核心就是理解對應(yīng)組件的功能以及其運(yùn)作方式!
簡單來講,Input 表示日志數(shù)據(jù)的來源,對不同來源的日志可以通過 Extractors 來進(jìn)行日志的字段轉(zhuǎn)換,比如將 Nginx 的狀態(tài)碼變成對應(yīng)的英文表述等。
然后,通過不同的標(biāo)簽類型分組成不用的 Stream,并將這些日志數(shù)據(jù)存儲到指定的 Index 庫中進(jìn)行持久化保存。
Graylog 中的核心服務(wù)組件
Graylog 通過 Input 搜集日志,每個 Input 單獨(dú)配置 Extractors 用來做字段轉(zhuǎn)換。
Graylog 中日志搜索的基本單位是 Stream,每個 Stream 可以有自己單獨(dú)的 Elastic Index Set,也可以共享一個 Index Set。
Extractor 在 System/Input 中配置。Graylog 中很方便的一點(diǎn)就是可以加載一條日志,然后基于這個實(shí)際的例子進(jìn)行配置并能直接看到結(jié)果。
內(nèi)置的 Extractor 基本可以完成各種字段提取和轉(zhuǎn)換的任務(wù),但是也有些限制,在應(yīng)用里寫日志的時候就需要考慮到這些限制。Input 可以配置多個 Extractors,按照順序依次執(zhí)行。
系統(tǒng)會有一個默認(rèn)的 Stream,所有日志默認(rèn)都會保存到這個 Stream 中,除非匹配了某個 Stream,并且這個 Stream 里配置了不保存日志到默認(rèn) Stream。
可以通過菜單 Streams 創(chuàng)建更多的 Stream,新創(chuàng)建的 Stream 是暫停狀態(tài),需要在配置完成后手動啟動。
Stream 通過配置條件匹配日志,滿足條件的日志添加 stream ID 標(biāo)識字段并保存到對應(yīng)的 Elastic Index Set 中。
Index Set 通過菜單 System/Indices 創(chuàng)建。日志存儲的性能,可靠性和過期策略都通過 Index Set 來配置。
性能和可靠性就是配置 Elastic Index 的一些參數(shù),主要參數(shù)包括,Shards 和 Replicas。
除了上面提到的日志處理流程,Graylog 還提供了 Pipeline 腳本實(shí)現(xiàn)更靈活的日志處理方案。
這里不詳細(xì)闡述,只介紹如果使用 Pipelines 來過濾不需要的日志。下面是丟棄 level > 6 的所有日志的 Pipeline Rule 的例子。
從數(shù)據(jù)采集(input),字段解析(extractor),分流到 stream,再到 Pipeline 的清洗,一氣呵成,無需在通過其他方式進(jìn)行二次加工。
Sidecar 是一個輕量級的日志采集器,通過訪問 Graylog 進(jìn)行集中式管理,支持 Linux 和 windows 系統(tǒng)。
Sidecar 守護(hù)進(jìn)程會定期訪問 Graylog 的 REST API 接口獲取 Sidecar 配置文件中定義的標(biāo)簽(tag),Sidecar 在首次運(yùn)行時會從 Graylog 服務(wù)器拉取配置文件中指定標(biāo)簽(tag)的配置信息同步到本地。
目前 Sidecar 支持 NXLog,F(xiàn)ilebeat 和 Winlogbeat。他們都通過 Graylog 中的 web 界面進(jìn)行統(tǒng)一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等輸出類型。
Graylog 最厲害的在于可以在配置文件中指定 Sidecar 把日志發(fā)送到哪個 Graylog 群集,并對 Graylog 群集中的多個 input 進(jìn)行負(fù)載均衡,這樣在遇到日志量非常龐大的時候,Graylog 也能應(yīng)付自如。
rule "discard debug messages"when to_long($message.level) > 6then drop_message();end
日志集中保存到 Graylog 后就可以方便的使用搜索了。不過有時候還是需要對數(shù)據(jù)進(jìn)行近一步的處理。
主要有兩個途徑,分別是直接訪問 Elastic 中保存的數(shù)據(jù),或者通過 Graylog 的 Output 轉(zhuǎn)發(fā)到其它服務(wù)。
五、服務(wù)安裝和部署
主要介紹部署 Filebeat+Graylog 的安裝步驟和注意事項!
使用 Graylog 來收集日志
1.部署 Filebeat 工具
官方提供了多種的部署方式,包括通過 rpm 和 deb 包安裝服務(wù),以及源代碼編譯的方式安裝服務(wù),同時包括了使用 Docker 或者 kubernetes 的方式安裝服務(wù)。
我們根據(jù)自己的實(shí)際需要,進(jìn)行安裝即可:
# 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 服務(wù)
我們這里主要介紹使用 Docker 容器來部署服務(wù),如果你需要使用其他方式來部署的話,請自行查看官方文檔對應(yīng)章節(jié)的安裝部署步驟。
在服務(wù)部署之前,我們需要給 Graylog 服務(wù)生成等相關(guān)信息,生成部署如下所示:
# 生成 password_secret 密碼(最少 16 位)$ sudo apt install -y pwgen$ pwgen -N 1 -s 16zscMb65...FxR9ag# 生成后續(xù) Web 登錄時所需要使用的密碼$ echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1Enter Password: zscMb65...FxR9ag77e29e0f...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 - elasticsearchnetworks: 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] 啟動容器指定地址和 driverdocker 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 界面的相關(guān)功能和對應(yīng)特點(diǎn)!
Graylog 界面功能
七、Spring Boot 集成GrayLog
首先創(chuàng)建一個SpringBoot項目,SpringBoot默認(rèn)自帶的日志框架是Logback,我們可以到 Graylog組件市場查找Logback相應(yīng)的組件。
添加依賴如下:
<dependency> <groupId>de.siegmar</groupId> <artifactId>logback-gelf</artifactId> <version>3.0.0</version></dependency>
接著在項目的resources目錄下,新建一個logback.xml文件,編輯文件內(nèi)容如下:
<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender"> <!-- Graylog服務(wù)的地址 --> <graylogHost>ip</graylogHost> <!-- UDP Input端口 --> <graylogPort>12201</graylogPort> <!-- 最大GELF數(shù)據(jù)塊大?。▎挝唬鹤止?jié)),508為建議最小值,最大值為65467 --> <maxChunkSize>508</maxChunkSize> <!-- 是否使用壓縮 --> <useCompression>true</useCompression> <encoder class="de.siegmar.logbackgelf.GelfEncoder"> <!-- 是否發(fā)送原生的日志信息 --> <includeRawMessage>false</includeRawMessage> <includeMarker>true</includeMarker> <includeMdcData>true</includeMdcData> <includeCallerData>false</includeCallerData> <includeRootCauseData>false</includeRootCauseData> <!-- 是否發(fā)送日志級別的名稱,否則默認(rèn)以數(shù)字代表日志級別 --> <includeLevelName>true</includeLevelName> <shortPatternLayout class="ch.qos.logback.classic.PatternLayout"> <pattern>%m%nopex</pattern> </shortPatternLayout> <fullPatternLayout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d - [%thread] %-5level %logger{35} - %msg%n</pattern> </fullPatternLayout> <!-- 配置應(yīng)用名稱(服務(wù)名稱),通過staticField標(biāo)簽可以自定義一些固定的日志字段 --> <staticField>app_name:austin</staticField> </encoder></appender>
在這個配置信息里,唯一要改的也只是 ip 的地址,到這里接入就完畢了,我們再打開控制臺,就能看到日志的信息啦。
配置完成后啟動項目,啟動完成后正常情況下可以在Graylog的Search界面中查看日志信息:
點(diǎn)擊一條日志信息會展開詳細(xì)的字段:
以上是最簡單的日志配置,如果希望對更多配置項進(jìn)行自定義的話,可以參考該組件的GitHub文檔,上面有具體的配置項說明
現(xiàn)在我們已經(jīng)成功將項目的日志數(shù)據(jù)發(fā)送到了Graylog服務(wù),如果我們想在Graylog上檢索日志也很簡單,只需要使用一些簡單的語法即可,例如我要查詢包含Mapping的日志信息:
還可以使用一些條件表達(dá)式,例如我要查詢message字段包含http,并且日志級別為INFO的日志信息:
常用的日志搜索語法如下:
- 模糊查詢:直接輸入要查詢的內(nèi)容,例如:orderid
- 精確查詢:要查詢的內(nèi)容加上引號,例如:"orderid: 11"
- 指定字段查詢:message:http 或 message:"http"
- 多字段查詢:message:(base-service base-web)
- 多條件查詢:message:http AND level_name:ERROR OR source:192.168.0.4