LogFilter Panel: 我做了一个 grafana 中更好用的 VictoriaLogs 日志筛选面板

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


VictoriaLogs 虽然提供了 grafana 的 data source 的插件(https://github.com/VictoriaMetrics/victorialogs-datasource),但是日志的筛选只能依赖 dashboard 上的 variable 配置。

由于 variable 的互动能力有限,导致使用者不经意间频繁使用全文搜索(full text search)来查询日志,并不断吐槽日志系统"难用"且"慢"。

为此,凭着非常过时的前端经验,靠着 codex 的帮助,做了一个很丑且有些用处的 Log Filter 面板,以此让日志检索更加便捷。

做好的 dashboard 如下:

目前已经把代码开源在:https://github.com/ahfuzhang/victorialogs-datasource

等到更完善后我会合入到官方的仓库中。

安装

我已经编译好这个插件,通过如下步骤即可使用:

  • grafana.ini 中声明非官方插件
ini 复制代码
    [plugins]
    allow_loading_unsigned_plugins = victoriametrics-logfilter-panel
  • 环境变量中指定插件目录
yaml 复制代码
- env:
  - name: GF_PATHS_PLUGINS
     value: /data/plugins/
  • init 容器中,通过 shell 下载:
bash 复制代码
# plugins
{
  plugin_dir="/data/plugins/"
  rm -rf ${plugin_dir}*
  echo "[OK] Cleaned ${plugin_dir}"
  plugins_urls=(
    "https://github.com/ahfuzhang/victorialogs-datasource/releases/download/v0.1.5/victoriametrics-logfilter-panel-v0.1.5.zip"
  )
  plugins_names=(
    "victoriametrics-logfilter-panel"
  )
  for i in "${!plugins_urls[@]}"; do
    plugin_url="${plugins_urls[$i]}"
    plugin_name="${plugins_names[$i]}"

    echo "Downloading plugin: $plugin_name from $plugin_url"
    wget -q -O /tmp/"$plugin_name".zip "$plugin_url"
    unzip -o /tmp/"$plugin_name".zip -d ${plugin_dir}
    echo "[DONE] Installed plugin: $plugin_name"
  done
}

安装好后,再创建 dashboard 后,可以搜索到:

功能介绍

0. 配置

  • 1.在 panel 的类型里面选择 LogFilter
  • 2.输入当前 chart 的标题
  • 3.选项:是否展示 logsql 的文本框
  • 4.文本框:stream list 的列表。以逗号分割的多个 stream field 字段名。
  • 5.文本框: 输出到 dashboard 的变量名。默认以 $logsql 为变量名,这样其他的 chart 中可以引用当前面板配置好的 logsql 语句。
  • 6.多行文本框:用于一些内部复杂逻辑的 json 配置。目前只支持两种:
    • extra_stream_filter: 当选择了 field A 时,根据 field A 的值,自动加一个 stream_field_B = regexp(A) . 例如:日志查询中通常使用 trace_id 来搜索日志,但是如果我把 trace_id 作为 stream_field 就会导致产生大量的 stream。于是我只取 trace_id 的最后一个字节,使用 trace_id_last_char 这个字段作为 stream_field。当查询 trace_id=xxx 时,这个配置会通过正则表达式取出最后一个字节,然后增加 {trace_id_last_char="x"},从而提高查询速度。
    • fixed_field_filter: field 部分可以添加任意多个。当某些 field 是经常查询的字段时,可以通过这个表达式配置固定的 N 个 field 的查询框。

在 LogFilter 的 Queries 部分:

  • 必须指定数据源
  • 不需要填写任何表达式

1.stream field 筛选

只有被加入 stream field 中的字段,才会创建索引

筛选日志时,优先从 stream field 开始筛选,能够加快日志的搜索速度。

  • 1.自动拉取数据源的 stream field 来展示
    • 如果需要自己定义展示哪些 stream field 或者调整顺序,可以打开 log filter 的配置:stream field list
  • 2.选择 stream field 的匹配表达式
    • 目前支持四种:等于,不等于,正则表达式匹配,不匹配
  • 3.选择操作符后,会自动拉取当前 stream field 的 50 个 value. 可以选择,或者输入。
    • 输入过程中会不断查询后端来匹配 stream field value
  • 4.stream field 是支持级联查询的。即选择第二个时,根据第一个表达式来过滤;选择第三个时,根据前面两个表达式来过滤......以此类推。
    • 某些情况下,级联可能导致搜索不出想要的内容。因此可以把 Cascade Filtering 这个选项取消。

2.field筛选

  • 1.filter by stream fields 选框:让出现的 field 与 stream filter 联动。如果不需要联动,把这个选框去掉。
  • 2.field下拉选框: 可以选择,或者输入要过滤的 field.
  • 3.field 过滤表达式:目前支持 11 种操作符。(LogsQL 至少支持 20 种以上的操作符,后续的版本会增加进去)
  • 4.field value 文本框:需要输入要匹配的 field 的 value
  • 5.Add 按钮: 因为可以用于过滤的 field 是不限数量的,所以需要点击 Add 按钮,不断追加过滤表达式。
  • 6.field 过滤表达式列表: 此处可以看到添加的多条 field 表达式,如果不想要,点击红色的❌进行删除。
  • 7.fixed 过滤表达式:可以在 LogFilter 的配置中设定需要一直展示的常用过滤字段。

3.message部分的过滤

日志的 message 部分认为是非结构化的,且一般内容较长。尽量不要在 message 部分进行过滤。

  • 选择过滤的操作符
  • 选择过滤的 field value

4.全文搜索部分的过滤

如果想查找某个词,但是又不知道在哪个字段中,可以使用全文搜索。注意:全文检索是最慢的,慎用!!

同样,选择操作符,并输入过滤表达式。

5.限制输出的日志行数

对于人类而言,输出 100 条数据可能足够了。其实我们是需要满足条件的前几条日志,精准优先于数量。

设置输出数量,可以提高查询性能。

6.配置输出字段

如果需要配置只输出日志中的部分字段,可以关闭掉 Output all fields 的选项,然后选择需要的字段。

  • 1.关闭 All 选项后,才会出现字段选择文本框
  • 2.文本框内编辑需要的字段名,可以以逗号分割,或者换行分割
  • 3.点击按钮one line,把字段列成一行,方便查看
  • 4.点击按钮multi line,把字段列成多行,方便编辑

7.直接编辑 logsql

  • 1.如果需要更复杂的 logsql 表达式,可以直接在文本框中编辑
  • 2.Copy LogsQL 可以把文本选择到剪贴板
  • 3.Test LogsQL 调用 hits 接口来测试查询语句是否正常:

可以根据错误提示来找到语句的问题。

  • 4.Query 按钮点击后开始查询。Log Volumn 面板和 Log Details 面板会看见详细信息。

完整 Dashboard

LogFilter 面板只是负责把各种过滤条件拼接成 logsql 语句,并写到对应的 variable $logsql 中。

如果需要展示 Log Volumn 和 详细日志,还需要做成 dashboard.

一个已经完成的 dashboard 可以从这里导入:https://github.com/ahfuzhang/victorialogs-datasource/blob/dev/20251205/test/dashboard/log-explorer-v8.json

有以下细节:

  • 可以选择 VictoriaLogs 的数据源

  • 有一个隐藏的变量 $logsql,用于各个 chart 之间的协调

  • variable 栏的 step 可以选择 log volumn 这部分的按照时间分组的统计步长:

  • Log Volumn 中的柱图使用了 Timeseries 来展示

    • 需要在 dashboard 的 JSON 中进行修改,把 queryType 设置为 hits 接口。
    • 猜测 hits 接口在 VictoriaLogs 内部采用了快速不精确的方法来统计日志数量,所以运行起来很快。
  • Log volumn 和 ratio 通过 level 字段来做 group by. Level 字段只能通过修改 dashboard JSON 来配置。(还做不到自动根据字段选择)

  • Log volumn 上支持鼠标框选,这样就能够根据时间范围来快速选择日志范围。

  • Logs 部分的 panel 仅需要注意一个配置:查询表达式填写 $logsql 即可。

欢迎多给我提意见,我努力把这个组件优化得更好用。

Have Fun. 😃