同步伺服器日誌到 SeaTable,讓日誌更好的視覺化和協同處理

SeaTable開發者版 發表於 2021-10-23
視覺化

SeaTable 開發者版是一款免費易用、可擴充套件的資料中臺產品。它同時結合了協同表格的易用性和資料庫強大的資料處理能力。SeaTable 提供了 Restful API,這樣你就可以很方便的隨時隨地通過 HTTP 協議來寫入資料。

本文我們主要介紹怎麼用 SeaTable 來記錄伺服器上多種服務的錯誤日誌,實現日誌的視覺化,防止錯誤資訊被忽視。總體的架構如下圖:

image.png

示例如下圖:

image.png

特色包括

  • 日誌用 Markdown 格式放在一個程式碼塊中並記錄到 SeaTable 的長文字列中
  • 我們可以用 SeaTable 多檢視的功能建立多個不同的檢視,每個檢視包括特定的過濾條件,方便我們快速的刪選檢視資料

下面來具體介紹搭建過程。

用 filebeat 來把日誌傳送到 Redis

安裝 filebeat

在宿主機上安裝,以 Ubuntu 20.04 為例

apt update && apt install filebeat -y

filebeat 配置檔案

vim /etc/filebeat/filebeat.yml

內容如下,根據實際配置修改

https://github.com/seatable/s...

filebeat.inputs:

  - type: log

    paths:

      - /opt/seatable/shared/seatable/logs/dtable_web.log        # 日誌路徑

    tags: ["dtable-web"]                                         # 對應表格中的 Service

    multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}|^[[0-9]{4}-[0-9]{2}-[0-9]{2}'

    multiline.negate: true        # 多行匹配,以日期開頭的資訊,例如:'2021-10-12' 或 '[2021-10-12'

    multiline.match: after

  
  - type: log

    paths:

      - /opt/seatable/shared/seatable/logs/dtable-server.log

    tags: ["dtable-server"]

    multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}|^[[0-9]{4}-[0-9]{2}-[0-9]{2}'

    multiline.negate: true

    multiline.match: after


output.redis:

  hosts: ["redis host"]

  password: "redis password"

  db: 0

  timeout: 5

  keys:

    - key: "seatable-error-logs"  # Redis key,不可修改

      when.contains:

        message: "[ERROR]"        # 匹配日誌中的關鍵詞

以上的示例配置適合於日誌中的時間格式為類似 2021-10-12 或者 [2021-10-12開頭,能夠識別出多行的錯誤日誌。

啟動 filebeat

filebeat 會把匹配的日誌傳送到 Redis 中

service filebeat start

用指令碼從 Redis 讀取訊息記錄到 SeaTable

SeaTable 表

  1. 生成 API Token
  2. 建立以下列,區分大小寫
名稱首列型別
Service文字 或 單選
Timex日期,精確到分鐘
Logx長文字

指令碼

在宿主機上安裝,路徑 /opt/ 為例

cd /opt/

git clone [email protected]:seatable/seatable-syncer.git

安裝 Python 依賴

cd seatable-syncer/log-sync/

pip3 install -r requirements.txt

配置檔案

vim log_syncer_settings.py

內容如下,根據實際配置修改

# SeaTable

server_url = 'SeaTable 伺服器地址'

api_token = '表格的 api_token'

table_name = 'table name'


# Redis

redis_host = 'redis host'

redis_db = 0

redis_port = 6379

redis_password = None

啟動指令碼

指令碼從 Redis 中讀取匹配的日誌,傳送到 SeaTable 中

python3 log_syncer.py

log_syncer.py 能夠處理以下格式開頭的日誌

2020-01-01 01:02:02

2020-01-01T01:02:02

[2020-01-01 01:02:02

[2020-01-01T01:02:02

如果你的日誌格式不符合上面的要求,可以自行修改下檔案 log_syncer.py 。

在 SeaTable 中共享和後續處理

在把日誌同步到 SeaTable 的一個表格後,我們就可以方便的把日誌資訊共享到群組和其他個人,方便協同來分析問題。還可以使用 提醒規則自動化規則 將日誌資訊即時通知給協作人。還可以加入自動處理規則,比如符合某些條件的日誌,加上可以忽略的標籤,符合某些條件日誌,加上待處理的標籤。

總結

通過 filebeat, Redis 和 Python 指令碼,我們就可以收集多個伺服器的日誌到 SeaTable 的一個表格中。通過表格的過濾條件、多檢視功能,我們可以方便的對日誌進行分析和檢視。通過共享協作功能,我們就可以方便的實現多人協同處理。此文拋磚引玉,希望大家發現 SeaTable 更多的用法,提升工作效率!