同步日志到 SeaTable,让日志更好的可视化

SeaTable 开发者版是一款免费易用、可扩展的数据中台产品。它同时结合了协同表格的易用性和数据库强大的数据处理能力。SeaTable 提供了 Restful API,这样你就可以很方便的随时随地通过 HTTP 协议来写入数据。

本文我们主要介绍怎么用 SeaTable 来记录服务器上多种服务的错误日志,实现日志的可视化,防止错误信息被忽视。总体的架构如下图:

示例如下图:

特色包括

  • 日志用 Markdown 格式放在一个代码块中并记录到 SeaTable 的长文本列中
  • 我们可以用 SeaTable 多视图的功能建立多个不同的视图,每个视图包括特定的过滤条件,方便我们快速的删选查看数据

下面来具体介绍搭建过程。

用 filebeat 来把日志发送到 Redis

安装 filebeat

在宿主机上安装,以 Ubuntu 20.04 为例

apt update && apt install filebeat -y

filebeat 配置文件

vim /etc/filebeat/filebeat.yml

内容如下,根据实际配置修改

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 文本 或 单选
Time x 日期,精确到分钟
Log x 长文本

脚本

在宿主机上安装,路径 /opt/ 为例

cd /opt/git clone git@github.com: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 的一个表格后,我们就可以方便的把日志信息共享到群组和其他个人,方便协同来分析问题。还可以使用 提醒规则自动化规则 将日志信息即时通知给协作人。还可以加入自动处理规则,比如符合某些条件的日志,加上可以忽略的标签,符合某些条件日志,加上待处理的标签。

比如我们要从日志中找出消息中包含 import-dtable 字符串的错误,并打上 “注意” 这样的标签,那么我们就可以新建一个标签列,增加 “注意” 选项。然后创建一个 Python 脚本:

from seatable_api import Base, context

server_url = context.server_url or 'https://cloud.seatable.cn'
api_token = context.api_token or 'xxxxx'


base = Base(api_token, server_url)
base.auth()


sql = "select _id,Service,Time,Log,Label from Table1 where Time >= today() and Log like '%import-dtable%'"
rows = base.query(sql)

for row in rows:
	if row["Label"] != "注意":
		base.update_row('Table1', row["_id"], { "Label": "注意" })

脚本中利用了 SeaTable 提供的 SQL 接口,方便的找到了要处理的记录。

总结

通过 filebeat, Redis 和 Python 脚本,我们就可以收集多个服务器的日志到 SeaTable 的一个表格中。通过表格的过滤条件、多视图功能,我们可以方便的对日志进行分析和查看。通过共享协作功能,我们就可以方便的实现多人协同处理。此文抛砖引玉,希望大家发现 SeaTable 更多的用法,提升工作效率!

1 个赞