blog.anqou.net
rss
author
tags

VictoriaLogs の LogsQL でクエリを書く

わくわく鮟鱇ランドではログの監視に Loki を使ってきたのですが、最近サーバーを変えた際に VictoriaLogs に乗り換えました。 Loki では LogQL というクエリ言語が使えます。一方 VictoriaLogs では LogsQL という異なるクエリ言語が使えるようになっています。公式ドキュメントにも “How To Convert Loki Queries to VictoriaLogs Queries” というページがあるので、これを参考に、普段よく使うような LogQL のクエリに対応する LogsQL のクエリを書いてみます。

ここでは VictoriaLogs を victoria-logs-single Helm Chart でインストールしたと前提します。

VictoriaLogs は構造化ログを前提にしており、ログをパーズできた場合はそのパーズ結果が LogsQL でクエリ可能になります。例えば以下のようなログを出力すると(実際は 1 行):

{
  "src": "caqti.request",
  "level": "DEBUG",
  "time": "2026-07-04 03:10:55Z",
  "msg": "Sending (unit -->. unit) {|COMMIT|} "
}

以下のようなログとして解釈されるようです。これは Grafana から JSON としてダウンロードしたものです:

{
  "line": "Sending (unit -->. unit) {|COMMIT|} ",
  "timestamp": "1783134655000000000",
  "date": "2026-07-04T03:10:55.000Z",
  "fields": {
    "detected_level": "debug",
    "_stream_id": "00000000000000009ec3fea17a316520778da75f343459fc",
    "kubernetes.container_id": "containerd://b91c5d06ee1441797c89f8df14ea7be7e400e3610ef64892bb5f8a8efca10b65",
    "kubernetes.container_name": "web",
    "kubernetes.pod_ip": "10.42.0.1",
    "kubernetes.pod_labels.app.kubernetes.io/name": "web",
    "kubernetes.pod_labels.pod-template-hash": "765cd5f56",
    "kubernetes.pod_name": "web-765cd5f56-zp4fw",
    "kubernetes.pod_namespace": "app",
    "kubernetes.pod_node_name": "node",
    "level": "DEBUG",
    "src": "caqti.request"
  }
}

元々のログにあった timemsg が時刻およびメッセージ本文として解釈され、それ以外のフィールドは fields に押し込まれます。また Pod などの情報が fields に付加されます。どのようなフィールドが時刻・メッセージ本文として認められるかはソースコードを見ると書いてあります:

https://github.com/VictoriaMetrics/VictoriaLogs/blob/v1.51.0/app/vlagent/kubernetescollector/processor.go#L628-L637

このようなログに対してクエリします。まず namespacepod などの stream field による指定は LogQL と同様に行うことができます。例えば namespace が appweb- から始まる Pod の指定は以下のように書きます:

{kubernetes.pod_namespace="app", kubernetes.pod_name=~"web-[^-]+-[^-]+"}

一方で、stream field ではないフィールドで抽出したい場合は level:="ERROR" のように := を使って書きます。正規表現を使うこともでき level:~"ERROR|WARN" と書けます。

msg にマッチさせたい場合は単にその内容を書きます。例えば Sendingmsg に含むようなログを出力する場合は以下のように書きます:

{kubernetes.pod_namespace="app", kubernetes.pod_name=~"web-[^-]+-[^-]+"} "Sending"

ただしここでのマッチは word/phrase によるマッチです。例えば endingSending にマッチしません。これをマッチさせたい場合は ~ を前置して正規表現を使います:

{kubernetes.pod_namespace="app", kubernetes.pod_name=~"web-[^-]+-[^-]+"} ~"ending"