企業級日誌平臺新秀Graylog,比ELK輕量多了

2022-01-05 雲時代架構

當我們公司內部部署很多服務以及測試、正式環境的時候,查看日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後使用 Nginx 對外提供服務,還是使用專用的日誌收集服務 ELK 呢?這就變成了一個問題!而 Graylog 作為整合方案,使用 elasticsearch 來存儲,使用 mongodb 來緩存,並且還有帶流量控制的 (throttling),同時其界面查詢簡單易用且易於擴展。所以,使用 Graylog 成為了不二之選,為我們省了不少心。

1. Filebeat 工具介紹

服務日誌收集方案:Filebeat + Graylog!

Filebeat 是一個日誌文件託運工具,在你的伺服器上安裝客戶端後,filebeat 會自動監控給定的日誌目錄或者指定的日誌文件,追蹤讀取這些文件,不停的讀取,並且轉發這些信息到 elasticsearch 或者 logstarsh 或者 graylog 中存放。

當你安裝並啟用 filebeat 程序的時候,它會啟動一個或多個探測器(prospectors)去檢測你指定的日誌目錄或文件,對於探測器找出的每一個日誌文件,filebeat 都會啟動一個收割進程(harvester),每一個收割進程讀取一個日誌文件的最新內容,並發送這些新的日誌數據到處理程序(spooler),處理程序會集合這些事件,最後 filebeat 會發送集合的數據到你指定的地址上去(我們這裡就是發送給graylog服務了)。

我們這裡不適用 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!

Graylog 是一個開源的日誌聚合、分析、審計、展現和預警工具。在功能上來說,和 ELK 類似,但又比 ELK 要簡單很多。依靠著更加簡潔,高效,部署使用簡單的優勢很快受到許多人的青睞。當然,在擴展性上面確實沒有比 ELK 好,但是其有商業版本可以選擇。

部署 graylog 最簡單的架構就是單機部署,複雜的也是部署集群模式,架構圖示如下所示。我們可以看到其中包含了三個組件,分別是 Elasticsearch、MongoDb 和 Graylog。其中,Elasticsearch 用來持久化存儲和檢索日誌文件數據(IO 密集),MongoDb 用來存儲關於 Graylog 的相關配置,而 Graylog 來提供 Web 界面和對外接口的(CPU 密集)。

最小化單機部署

最優化集群部署

4. Graylog 組件功能

配置 Graylog 服務的核心就是理解對應組件的功能以及其運作方式!

簡單來講,Input 表示日誌數據的來源,對不同來源的日誌可以通過 Extractors 來進行日誌的欄位轉換,比如將 Nginx 的狀態碼變成對應的英文表述等。然後,通過不同的標籤類型分組成不用的 Stream,並將這些日誌數據存儲到指定的 Index 庫中進行持久化保存。

編號組件名稱功能介紹主要特點1Dashboards數據面板固定展示主要是用來保存特定搜索條件的數據面板2Searching日誌信息條件搜索關鍵字搜索、時間搜索、搜索保存、創建面板、分組查詢、結果導出、查詢高亮顯示、自定義時間3Alert設置告警提示方式支持郵件告警、HTTP 回調和自定義腳本觸發4Inputs日誌數據抓取接收部署 Sidercar 主動抓取或使用其他服務被動上報5Extractors日誌數據格式轉換json 解析、kv 解析、時間戳解析、正則解析6Streams日誌信息分類分組設置日誌分類條件並發送到不同的索引文件中去7Indices持久化數據存儲設置數據存儲性能8Outputs日誌數據的轉發解析的 Stream 發送到其他 Graylog 集群或服務9Pipelines日誌數據的過濾建立數據清洗的過濾規則、欄位添加刪除、條件過濾、自定義函數等10Sidecar輕量級的日誌採集器相當於 C/S 模式;大規模時使用11Lookup Tables服務解析基於 IP 的 Whois 查詢和基於來源 IP 的情報監控12Geolocation可視化地理位置實現基於來源 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 的安裝步驟和注意事項!

使用Graylog來收集日誌

官方提供了多種的部署方式,包括通過 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來收集日誌

我們這裡主要介紹使用 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"
.

6. Graylog 界面功能

主要介紹 Graylog 界面的相關功能和對應特點!

版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝!

相關焦點

  • 企業級日誌平臺新秀Graylog,比ELK輕量多了~
    是多個環境的日誌統一收集,然後使用 Nginx 對外提供服務,還是使用專用的日誌收集服務 ELK 呢?這就變成了一個問題!而 Graylog 作為整合方案,使用 elasticsearch 來存儲,使用 mongodb 來緩存,並且還有帶流量控制的 (throttling),同時其界面查詢簡單易用且易於擴展。所以,使用 Graylog 成為了不二之選,為我們省了不少心。1.
  • 比 ELK 更簡潔、高效!企業級日誌平臺後起之秀 Graylog!
    服務日誌收集工具 Filebeat介紹可參考:ELK + Filebeat 搭建日誌系統Graylog 服務介紹Graylog - 日誌監控系統Graylog 是一個開源的日誌聚合、分析、審計、展現和預警工具。
  • 企業級日誌平臺新秀Loki,比ELK輕量多了~
    日誌數據的寫主要依託的是 Distributor 和 Ingester 兩個組件,整體的流程如下:一旦 Promtail 收集日誌並將其發送給 Loki,Distributor 就是第一個接收日誌的組件。由於日誌的寫入量可能很大,所以不能在它們傳入時將它們寫入資料庫。這會毀掉資料庫。我們需要批處理和壓縮數據。
  • ELK Stack 企業級日誌平臺
    使用方便,直接解決了我們的需求,並且是開源的;相對來說,學習還是配置都是相對簡單的;ES搜索快,基本上是秒級的;那如果日誌量過大的話,日誌是不是會從而丟失?防止logstash 直接與ES操作,產生大量的連結,導致ES瓶頸!
  • 如何用 Graylog 管理容器K8S日誌
    上一節我們介紹了graylog,它是一款可以和ELK 相提並論的集中式日誌管理系統,它能支持數據收集、檢索、可視化一整套流程,並且我們上一節學習了它的安裝
  • 企業級日誌平臺新秀Grafana Loki,比ELK輕量多了~
    我們都知道,Kubernetes的基本單位是Pod,Pod把日誌輸出到stdout和stderr,平時有什麼問題我們通常在界面或者通過命令查看相關的日誌,舉個例子:當我們的某個Pod的內存變得很大,觸發了我們的Alert,這個時候管理員,去頁面查詢確認是哪個Pod有問題,然後要確認Pod內存變大的原因,我們還需要去查詢Pod的日誌,如果沒有日誌系統,那麼我們就需要到頁面或者使用命令進行查詢了:
  • ELK 是什麼?一文全面了解 ELK Stack 企業級日誌平臺
    日誌分析系統的優勢使用方便,直接解決了我們的需求,並且是開源的;相對來說,學習還是配置都是相對簡單的;ES搜索快,基本上是秒級的;)Redis和kafka的作用那如果logstash和ES無法通訊的話,日誌是不是會從而丟失?
  • 安裝 Graylog 日誌系統
    這節學習Graylog,它是一款可以和ELK 相提並論的集中式日誌管理系統,它能支持數據收集、檢索、可視化一整套流程。本節學習實驗用 Graylog 來管理容器Docker 日誌。Graylog 架構我們先看下Graylog 的架構圖:Graylog:接收多種設備和應用的日誌,並提供 Web 接口。
  • Spring Boot 使用 Graylog 收集日誌
    1.Graylog介紹Graylog是一個生產級別的日誌收集系統,集成Mongo和Elasticsearch進行日誌收集。其中Mongo用於存儲Graylog的元數據信息和配置信息,ElasticSearch用於存儲數據。
  • 用docker快速搭建elk日誌平臺
    在後臺服務數量較多時,登陸機器查看日誌是非常低效的。所以需要一個集中的日誌查看平臺。elk便是為此誕生的。
  • 如何使用Graylog來收集日誌?
    是多個環境的日誌統一收集,然後使用 Nginx 對外提供服務,還是使用專用的日誌收集服務 ELK 呢?這就變成了一個問題!而 Graylog 作為整合方案,使用 Elasticsearch 來存儲,使用 MongoDB 來緩存,並且還有帶流量控制的(throttling),同時其界面查詢簡單易用且易於擴展。所以,使用 Graylog 成為了不二之選,為我們省了不少心。
  • ELK 處理 Spring Boot 日誌,妙!
    現今大多採用的微服務架構,日誌被分散在不同的機器上,使得日誌的查詢變得異常困難。工欲善其事,必先利其器。如果此時有一個統一的實時日誌分析平臺,那可謂是雪中送碳,必定能夠提高我們排查線上問題的效率。本文帶您了解一下開源的實時日誌分析平臺 ELK 的搭建及使用。
  • Ubuntu 16.04 下部署 Graylog 2.x 日誌伺服器
    Graylog 是一個開源的日誌管理系統,集中式收集、索引、分析其它伺服器發來的日誌。
  • ELK 日誌收集系統
    ELK簡介    在傳統項目中,如果在生產環境中,有多臺不同的伺服器集群,如果生產環境需要通過日誌定位項目的Bug的話,需要在每臺節點上使用傳統的命令方式查詢
  • 小識牛刀:Docker+ELK打造微服務日誌收集平臺
    Logstash是日誌聚合器,它使用一個pipeline 來接收輸入,過濾數據,並推送日誌輸出。Logstash可以使用不同的輸入插件從不同的源獲取日誌,並以期望的方式推送日誌。Kibana是一個用來可視化Elasticsearch數據的軟體,是一個帶有Elasticsearch的插件。
  • 部署 Graylog 日誌系統 - 每天5分鐘玩轉 Docker 容器技術(92)
    Graylog 是與 ELK 可以相提並論的一款集中式日誌管理方案,支持數據收集、檢索、可視化 Dashboard。
  • 使用EVE-NG模擬山石網科防火牆syslog日誌接入GrayLog4.1
    下面細說具體的步驟一、EVE-NG下模擬網絡設備syslog日誌 使用的是EVE-NG社區懶人版,測試使用hillstone山石網科防火牆連結: https://pan.baidu.com/s/15G_ONhBD7TpZo3w0vKmU0g 提取碼: xucy
  • 使用Docker搭建ELK日誌系統
    目標收集Java日誌文件,並且根據文件的不同將日誌分類,比如:訂單日誌,客戶日誌等。日誌文件多行處理總體架構圖2017-12-28-11-23-36準備鏡像6.0之後官方開始自己維護鏡像版本:https://www.docker.elastic.co/。
  • ELK日誌平臺:安裝配置搭建(1)
    ELK日誌平臺介紹在搜索ELK資料的時候,發現這篇文章比較好,於是摘抄一小段:日誌主要包括系統日誌
  • Kubernetes實戰之部署ELK Stack收集平臺日誌
    市面上很多開發只要提到ELK能夠一致說出它是一個日誌分析架構技術棧總稱,但實際上ELK不僅僅適用於日誌分析,它還可以支持其它任何數據分析和收集的場景,日誌分析和收集只是更具有代表性。並非唯一性。我們本教程主要也是圍繞通過ELK如何搭建一個生產級的日誌分析平臺來講解ELK的使用。