本文へ移動
runlot
Observabilityログ

ログ

ワーカーの出力をリアルタイムで確認し、レベル、ストリーム、リクエストで絞り込み、ここ数日のあいだに出力した内容を検索します。

runlot logs

Ctrl-C を押すと終了します。接続するとまず直近の 200 行を受け取り、その後は新しいログをリアルタイムで受け取ります。

runlot logs --tail 1000        # how many lines to receive up front (max 2000)
runlot logs --no-follow        # print up to the most recent line and exit

リアルタイムログの絞り込み

フィルターは行を送信する前にノード上で適用されるため、出力の多いワーカーでもターミナルがあふれることはありません。

runlot logs --level warn                    # warn and error only
runlot logs --source stderr                 # one stream: stdout, stderr or runlot
runlot logs --request 4bf92f3577b34da6a3ce929d0e0e4736
runlot logs --tail 500 --grep timeout       # --grep filters the live tail when --tail or --no-follow is given

レベルの順序は debug < log = info < warn < error で、--level はそのレベルとそれより上のレベルを残します。level フィールドを持つ JSON として出力された行は、そのレベルとして扱います。それ以外の場合、stderr は error、stdout は log です。runlot ストリームは、プロジェクトについて Runlot 自身が出力する行(起動、停止、メモリ不足)です。

--format json は、保存されたイベントと同じ形のオブジェクトを 1 行に 1 つずつ出力します。

runlot logs --format json | jq 'select(.level == "error")'

過去のログ

runlot logs は今この瞬間からの出力を追いかけます。それより前に出力した内容を見るには、期間を指定します。

runlot logs --since 2h                  # the last two hours
runlot logs --since 24h --grep ERROR    # only lines containing ERROR
runlot logs --since 2026-09-20T10:00 --until 2026-09-20T11:00
runlot logs --since 6h --level error --source exception

--since と --until は、期間(30m、2h、3d)または時刻(2026-09-20T10:00、あるいは 2026-09-20 のような日付単体)のいずれかを受け取ります。時刻は UTC であり、出力される行に付くタイムスタンプと同じタイムゾーンなので、出力からコピーしたタイムスタンプをそのまま貼り戻せます。代わりに自分のタイムゾーンを指定するには、末尾に +09:00 や -04:30 を書きます。--grep を単独で使うと保存されたログを検索します。正規表現ではなく単純な部分文字列です。

保存されたログには、リアルタイムログにはないソースが 2 つあります。console(内容が収集されたリクエストの行)と exception です。--level、--request、そしてこの 2 つのソースにはイベントストアが必要です。ClickHouse のないセルフホスト環境では、これらを無視せず、名前を示して拒否します。

過去のログは古い行から出力し、1 ページを超える期間の場合は、次のページを取得する方法を最後の行に表示します。

-- more available: rerun with --cursor obs.1790244251882.3

--limit は 1 ページあたりの行数を指定します(既定は 200、最大 1,000)。ダッシュボードにも同じ機能があり、Observability → Logs で期間と検索語を指定します。

ログの保管期間

ワーカーが出力したすべての行を、Free プランは 3 日間、Pro プランは 7 日間保管します。その後は削除され、復元はできません。それより長く保管するには、ご自身のバケットやコレクターへエクスポートしてください。

1 つのプロジェクトが 1 日に保存できるログイベントは、Free プランで 200,000 件、Pro プランで 2,000,000 件で、UTC の日付を基準に数えます。この上限を超えても、リアルタイムログはこれまでどおり動作し、その日の残りは 100 件に 1 件だけを保存します。保存するイベントはリクエスト単位で選ぶため、1 つのリクエストの行はまとまったまま残ります。Query Builder の件数には重みが付くため、実際の量を引き続き推定できます。Pro プランでは上限を引き上げるか解除できます。上限とコスト をご覧ください。

ClickHouse のないセルフホスト環境では、保存した行を同じ 1 日あたりの件数で PostgreSQL に保管し、上限に達するとその日の保存を止めて、そのことを示す行を 1 回だけ残します。

runlot: daily log cap reached (200000 lines); further lines today are dropped
リアルタイムログと保存された履歴は別のものです。リアルタイムログはノードのメモリ上のリングバッファを読みます。プロジェクトごとに 2,000 行または 1 MiB のいずれか先に達した方まで保管し、ノードエージェントを再起動すると空になります。履歴はコントロールプレーンに保存するため、再起動、再デプロイ、プロジェクトのノード移動のあとも残ります。

スキップされたログの通知

runlot logs を実行しているターミナルが出力を十分な速さで処理できない場合、そのストリームでは一部のログ行がスキップされます。遅いログ購読がプロジェクトの実行を遅らせないようにするための動作です。

スキップされたログの行数は、ストリームの通知イベントとして表示します。

-- dropped 128 lines — this log stream could not keep up with the worker

もともとログがなかった場合と、転送中にスキップされた場合を区別できるように、この通知を提供しています。

パイプで使う場合

ストリーム終了の通知とページングの案内は stderr に出力します。

runlot logs --no-follow | grep ERROR

パイプの先の grep には、ワーカーが出力したログ行だけが渡されます。

ログ 1 件あたりのサイズ制限

リアルタイムログでは、各ログ項目は最大 64 KiB です。収集された console.log は 256 KiB で切り詰められ、truncated の印が付きます。

オブジェクトのログ出力

最初の引数にプレーンなオブジェクトを渡すと、そのフィールドがクエリ可能なキーになります。

console.log({ event: "checkout", userId: 42, cents: 1999 });

Query Builder では、userId と cents で絞り込みができ、組み込みのフィールドと同じようにグループ化や合計ができます。

このページの目次