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 中声明非官方插件
[plugins]
allow_loading_unsigned_plugins = victoriametrics-logfilter-panel
- 环境变量中指定插件目录
- env:
- name: GF_PATHS_PLUGINS
value: /data/plugins/
- init 容器中,通过 shell 下载:
# 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 的查询框。
- 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 时,这个配置会通过正则表达式取出最后一个字节,然后增加
在 LogFilter 的 Queries 部分:

- 必须指定数据源
- 不需要填写任何表达式
1.stream field 筛选
只有被加入 stream field 中的字段,才会创建索引
筛选日志时,优先从 stream field 开始筛选,能够加快日志的搜索速度。

- 1.自动拉取数据源的 stream field 来展示
- 如果需要自己定义展示哪些 stream field 或者调整顺序,可以打开 log filter 的配置:
stream field list
- 如果需要自己定义展示哪些 stream field 或者调整顺序,可以打开 log filter 的配置:
- 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. 😃

浙公网安备 33010602011771号