ELK 不香了!我用 Graylog,輕量多了...

来源:https://www.cnblogs.com/javastack/archive/2023/10/30/17797939.html
-Advertisement-
Play Games

作者:Escape 來源:https://www.escapelife.site/posts/38c81b25.html 服務日誌收集方案:Filebeat + Graylog! 當我們公司內部部署很多服務以及測試、正式環境的時候,查看日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後 ...


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

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

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

這就變成了一個問題!而 Graylog 作為整合方案,使用 elasticsearch 來存儲,使用 mongodb 來緩存,並且還有帶流量控制的 (throttling),同時其界面查詢簡單易用且易於擴展。

所以,使用 Graylog 成為了不二之選,為我們省了不少心。

使用Graylog來收集日誌


1. Filebeat 工具介紹

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

[1] Filebeat - 日誌文件托運服務

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

[2] Filebeat - 工作流程介紹

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

[3] Filebeat - 圖示理解記憶

我們這裡不適用 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 還提供了不同了模塊來配置不同的服務日誌以及其不同的模塊特性,比如我們常見的 PostgreSQlRedisIptables 等。

# 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!

[1] Graylog - 日誌監控系統

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

[2] Graylog - 工作流程介紹

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

最小化單機部署

最優化集群部署


4. Graylog 組件功能

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

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

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

Graylog中的核心服務組件

Graylog中的核心服務組件

Graylog 通過 Input 搜集日誌,每個 Input 單獨配置 Extractors 用來做欄位轉換。Graylog 中日誌搜索的基本單位是 Stream,每個 Stream 可以有自己單獨的 Elastic Index Set,也可以共用一個 Index Set

ExtractorSystem/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 的一些參數,主要參數包括,ShardsReplicas

除了上面提到的日誌處理流程,Graylog 還提供了 Pipeline 腳本實現更靈活的日誌處理方案。這裡不詳細闡述,只介紹如果使用 Pipelines 來過濾不需要的日誌。下麵是丟棄 level > 6 的所有日誌的 Pipeline Rule 的例子。從數據採集(input),欄位解析(extractor),分流到 stream,再到 pipeline 的清洗,一氣呵成,無需在通過其他方式進行二次加工。

Sidecar 是一個輕量級的日誌採集器,通過訪問 graylog 進行集中式管理,支持 linuxwindows 系統。Sidecar 守護進程會定期訪問 graylogREST API 介面獲取 Sidecar 配置文件中定義的標簽(tag) ,Sidecar 在首次運行時會從 graylog 伺服器拉取配置文件中指定標簽(tag) 的配置信息同步到本地。

目前 Sidecar 支持 NXLogFilebeatWinlogbeat。他們都通過 graylog 中的 web 界面進行統一配置,支持 BeatsCEFGelfJson APINetFlow 等輸出類型。Graylog 最厲害的在於可以在配置文件中指定 Sidecar 把日誌發送到哪個 graylog 群集,並對 graylog 群集中的多個 input 進行負載均衡,這樣在遇到日誌量非常龐大的時候,graylog 也能應付自如。

rule "discard debug messages"
when
  to_long($message.level) > 6
then
  drop_message();
end

日誌集中保存到 Graylog 後就可以方便的使用搜索了。不過有時候還是需要對數據進行近一步的處理。主要有兩個途徑,分別是直接訪問 Elastic 中保存的數據,或者通過 GraylogOutput 轉發到其它服務。


5. 服務安裝和部署

主要介紹部署 Filebeat + Graylog 的安裝步驟和註意事項!

使用Graylog來收集日誌

[1] 部署 Filebeat 工具

官方提供了多種的部署方式,包括通過 rpmdeb 包安裝服務,以及源代碼編譯的方式安裝服務,同時包括了使用 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來收集日誌

[2] 部署 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 的支持。只需要我們在 Graylogsystem/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界面功能

Graylog界面功能

Graylog界面功能

Graylog界面功能

Graylog界面功能

授人玫瑰,手有餘香!

相關參考文章引用:

Filebeat 官方手冊:https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Filebeat 中文指南:https://www.cnblogs.com/kerwinC/p/6227768.html
Graylog 集中日誌系統:https://medium.com/@doitian/graylog-集中日誌系統-1f715bb7998c
Graylog2 採集 Nginx 日誌 主動方式:https://zhuanlan.zhihu.com/p/113761931
Graylog2 採集 Nginx 日誌 主動方式:https://zhuanlan.zhihu.com/p/113761931

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前端標簽 標簽的分類 1. 單標簽 img br hr <img /> 2. 雙標簽 a h p div <a></a> 3. 按照標簽屬性分類 1. 塊兒標簽 # 自己獨自占一行 h1-h6 p div 2. 行內(內聯)標簽 # 自身文本有多大就占多大 a span u i b s div標簽和 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 簡介 大家好,前端小白一枚,目前接觸後臺管理系統比較多,經常遇到不同對象的增刪改查的介面,如何對Api進行一個有比較好的管理是個問題。在學習偏函數的時候有了靈感,想到一個不錯的API管理方案,並應用在項目一個模塊當中,並且開發效率和維護性 ...
  • 一、字元串類型的轉換 1、自動轉換 <script> var str = 'hello'; var num = 100; console.log(str+num); console.log(typeof (str+num)); </script> 2、強制轉換 String(),object.toS ...
  • 基於electron27+react18+arco電腦端後臺管理程式EXE實例ElectronRAdmin。 electron27-react18-admin 基於跨平臺技術Electron集成Vite.js構建桌面端React18後臺管理系統應用解決方案。支持dark/light主題、中英文/繁體 ...
  • 拉取鏡像 docker pull mongo 使用 docker 安裝 mongodb docker run --restart=always --name mongodb -v ~/docker/mongo:/data/db -d -p 27017:27017 -e MONGO_INITDB_RO ...
  • Lock實現線程間定製化通信 案例 要求 三個線程,AA BB CC AA線程列印5次,BB線程列印10次,CC線程列印15次 代碼實現 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lo ...
  • 基礎代碼 只包含最簡單的代碼,不包含亂碼解決、文件上傳。 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; imp ...
  • 不論是在團隊寫作還是在個人工作中,PDF 文檔往往會經過多次修訂和更新。掌握 PDF 文檔內容的變化對於管理文檔有極大的幫助。通過對比 PDF 文檔,用戶可以快速找出文檔增加、刪除和修改的內容,更好地瞭解文檔的演變過程,輕鬆地管理文檔。本文將介紹如何在 Java 程式中通過代碼快速比較兩個 PDF ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...