わくわく鮟鱇ランドではログの監視に 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"
}
}
元々のログにあった time や msg が時刻およびメッセージ本文として解釈され、それ以外のフィールドは fields に押し込まれます。また Pod などの情報が fields に付加されます。どのようなフィールドが時刻・メッセージ本文として認められるかはソースコードを見ると書いてあります:
このようなログに対してクエリします。まず namespace や pod などの stream field による指定は LogQL と同様に行うことができます。例えば namespace が app で web- から始まる Pod の指定は以下のように書きます:
{kubernetes.pod_namespace="app", kubernetes.pod_name=~"web-[^-]+-[^-]+"}
一方で、stream field ではないフィールドで抽出したい場合は level:="ERROR" のように := を使って書きます。正規表現を使うこともでき level:~"ERROR|WARN" と書けます。
msg にマッチさせたい場合は単にその内容を書きます。例えば Sending を msg に含むようなログを出力する場合は以下のように書きます:
{kubernetes.pod_namespace="app", kubernetes.pod_name=~"web-[^-]+-[^-]+"} "Sending"
ただしここでのマッチは word/phrase によるマッチです。例えば ending は Sending にマッチしません。これをマッチさせたい場合は ~ を前置して正規表現を使います:
{kubernetes.pod_namespace="app", kubernetes.pod_name=~"web-[^-]+-[^-]+"} ~"ending"