企業級日誌平臺新秀!比 ELK 更輕量、更高效

民工哥發表於2021-12-13

當我們公司內部部署很多服務以及測試、正式環境的時候,檢視日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後使用 Nginx 對外提供服務,還是使用專用的日誌收集服務 ELK 呢?這就變成了一個問題!

image.png

而 Graylog 作為整合方案,使用 Elasticsearch 來儲存,使用 MongoDB 來快取,並且還有帶流量控制的(throttling),同時其介面查詢簡單易用且易於擴充套件。所以,使用 Graylog 成為了不二之選,為我們省了不少心。

image.png

Filebeat 工具介紹

Filebeat 日誌檔案託運服務

Filebeat 是一個日誌檔案託運工具,在你的伺服器上安裝客戶端後,Filebeat 會自動監控給定的日誌目錄或者指定的日誌檔案,追蹤讀取這些檔案,不停的讀取,並且轉發這些資訊到 Elasticsearch 或者 Logstarsh 或者 Graylog 中存放。

Filebeat 工作流程介紹

當你安裝並啟用 Filebeat 程式的時候,它會啟動一個或多個探測器(prospectors)去檢測你指定的日誌目錄或檔案。

對於探測器找出的每一個日誌檔案,Filebeat 都會啟動一個收割程式(harvester)。

每一個收割程式讀取一個日誌檔案的最新內容,併傳送這些新的日誌資料到處理程式(spooler),處理程式會集合這些事件。

最後 Filebeat 會傳送集合的資料到你指定的地址上去(我們這裡就是傳送給 Graylog 服務了)。

Filebeat 圖示理解記憶

我們這裡不適用 Logstash 服務,主要是因為 Filebeat 相比於 Logstash 更加輕量級。

當我們需要收集資訊的機器配置或資源並不是特別多時,且並沒有那麼複雜的時候,還是建議使用 Filebeat 來收集日誌。

日常使用中,Filebeat 的安裝部署方式多樣且執行十分穩定。

image.png

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 服務介紹

Graylog 日誌監控系統

Graylog 是一個開源的日誌聚合、分析、審計、展現和預警工具。在功能上來說,和 ELK 類似,但又比 ELK 要簡單很多。

依靠著更加簡潔,高效,部署使用簡單的優勢很快受到許多人的青睞。當然,在擴充套件性上面確實沒有比 ELK 好,但是其有商業版本可以選擇。

Graylog 工作流程介紹

部署 Graylog 最簡單的架構就是單機部署,複雜的也是部署叢集模式,架構圖示如下所示。我們可以看到其中包含了三個元件,分別是 Elasticsearch、MongoDB 和 Graylog。

其中,Elasticsearch 用來持久化儲存和檢索日誌檔案資料(IO 密集),MongoDB 用來儲存關於 Graylog 的相關配置,而 Graylog 來提供 Web 介面和對外介面的(CPU 密集)。

最小化單機部署

image.png

最優化叢集部署

image.png

Graylog 元件功能

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

簡單來講,Input 表示日誌資料的來源,對不同來源的日誌可以通過 Extractors 來進行日誌的欄位轉換,比如將 Nginx 的狀態碼變成對應的英文表述等。

然後,通過不同的標籤型別分組成不用的 Stream,並將這些日誌資料儲存到指定的 Index 庫中進行持久化儲存。

image.png

image.png

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 的安裝步驟和注意事項!

image.png

部署 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 服務

我們這裡主要介紹使用 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 裡面了。

# [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 介面的相關功能和對應特點!

image.png

image.png

作者:Escape
來源:escapelife.site/posts/38c81b25.html

相關文章