ロギング

Mayrosは2か所にログを記録します:

  • Gatewayによって書き込まれるファイルログ(JSON行)。
  • ターミナルとControl UIに表示されるコンソール出力

このページでは、ログの場所、読み方、ログレベルとフォーマットの設定方法を説明します。

ログの場所

デフォルトでは、Gatewayは以下の場所にローリングログファイルを書き込みます:

/tmp/mayros/mayros-YYYY-MM-DD.log

日付はgatewayホストのローカルタイムゾーンを使用します。

~/.mayros/mayros.jsonで上書きできます:

json
{
  "logging": {
    "file": "/path/to/mayros.log"
  }
}

ログの読み方

CLI: ライブテール(推奨)

CLIを使用してRPC経由でgatewayログファイルをテールします:

bash
mayros logs --follow

出力モード:

  • TTYセッション: きれいで、カラー化され、構造化されたログ行。
  • 非TTYセッション: プレーンテキスト。
  • --json: 行区切りJSON(1行に1つのログイベント)。
  • --plain: TTYセッションでプレーンテキストを強制。
  • --no-color: ANSIカラーを無効化。

JSONモードでは、CLIはtypeタグ付きオブジェクトを出力します:

  • meta: ストリームメタデータ(ファイル、カーソル、サイズ)
  • log: 解析されたログエントリ
  • notice: 切り捨て/ローテーションヒント
  • raw: 未解析ログ行

Gatewayに到達できない場合、CLIは以下を実行するための短いヒントを表示します:

bash
mayros doctor

Control UI(Web)

Control UIのLogsタブは、logs.tailを使用して同じファイルをテールします。 開き方については、/web/control-uiを参照してください。

チャネルのみのログ

チャネルアクティビティ(WhatsApp/Telegramなど)をフィルタリングするには、以下を使用します:

bash
mayros channels logs --channel whatsapp

ログフォーマット

ファイルログ(JSONL)

ログファイルの各行はJSONオブジェクトです。CLIとControl UIはこれらの エントリを解析して、構造化された出力(時刻、レベル、サブシステム、メッセージ)をレンダリングします。

コンソール出力

コンソールログはTTY対応で、読みやすさのためにフォーマットされています:

  • サブシステムプレフィックス(例:gateway/channels/whatsapp
  • レベルカラーリング(info/warn/error)
  • オプションのコンパクトまたはJSONモード

コンソールフォーマットはlogging.consoleStyleによって制御されます。

ロギングの設定

すべてのロギング設定は、~/.mayros/mayros.jsonloggingの下にあります。

json
{
  "logging": {
    "level": "info",
    "file": "/tmp/mayros/mayros-YYYY-MM-DD.log",
    "consoleLevel": "info",
    "consoleStyle": "pretty",
    "redactSensitive": "tools",
    "redactPatterns": ["sk-.*"]
  }
}

ログレベル

  • logging.level: ファイルログ(JSONL)レベル。
  • logging.consoleLevel: コンソール詳細レベル。

--verboseはコンソール出力にのみ影響します。ファイルログレベルは変更されません。

コンソールスタイル

logging.consoleStyle:

  • pretty: 人間に優しい、カラー化、タイムスタンプ付き。
  • compact: より密な出力(長いセッションに最適)。
  • json: 1行にJSON(ログプロセッサ用)。

リダクション

ツールサマリーは、コンソールに到達する前に機密トークンをリダクションできます:

  • logging.redactSensitive: off | tools(デフォルト:tools
  • logging.redactPatterns: デフォルトセットを上書きする正規表現文字列のリスト

リダクションはコンソール出力のみに影響し、ファイルログは変更しません。

診断 + OpenTelemetry

診断は、モデル実行および メッセージフローテレメトリ(Webhook、キューイング、セッション状態)のための構造化された機械可読イベントです。ログを 置き換えるものではありません。メトリクス、トレース、その他のエクスポーターに供給するために存在します。

診断イベントはプロセス内で発行されますが、エクスポーターは 診断 + エクスポータープラグインが有効になっている場合にのみアタッチされます。

OpenTelemetry vs OTLP

  • OpenTelemetry(OTel): トレース、メトリクス、ログのデータモデル + SDK。
  • OTLP: OTelデータをコレクター/バックエンドにエクスポートするために使用されるワイヤプロトコル。
  • Mayrosは今日**OTLP/HTTP(protobuf)**経由でエクスポートします。

エクスポートされるシグナル

  • メトリクス: カウンター + ヒストグラム(トークン使用量、メッセージフロー、キューイング)。
  • トレース: モデル使用 + Webhook/メッセージ処理のスパン。
  • ログ: diagnostics.otel.logsが有効な場合、OTLP経由でエクスポート。ログ ボリュームは高くなる可能性があります。logging.levelとエクスポーターフィルターに注意してください。

診断イベントカタログ

モデル使用:

  • model.usage: トークン、コスト、期間、コンテキスト、プロバイダー/モデル/チャネル、セッションID。

メッセージフロー:

  • webhook.received: チャネルごとのWebhookイングレス。
  • webhook.processed: Webhook処理 + 期間。
  • webhook.error: Webhookハンドラーエラー。
  • message.queued: 処理のためにキューに入れられたメッセージ。
  • message.processed: 結果 + 期間 + オプションのエラー。

キュー + セッション:

  • queue.lane.enqueue: コマンドキューレーンエンキュー + 深さ。
  • queue.lane.dequeue: コマンドキューレーンデキュー + 待機時間。
  • session.state: セッション状態遷移 + 理由。
  • session.stuck: セッションスタック警告 + 経過時間。
  • run.attempt: 再試行/試行メタデータを実行。
  • diagnostic.heartbeat: 集約カウンター(Webhook/キュー/セッション)。

診断を有効化(エクスポーターなし)

プラグインまたはカスタムシンクで診断イベントを利用可能にしたい場合は、これを使用します:

json
{
  "diagnostics": {
    "enabled": true
  }
}

診断フラグ(ターゲットログ)

フラグを使用して、logging.levelを上げずに追加のターゲットデバッグログをオンにします。 フラグは大文字と小文字を区別せず、ワイルドカード(例:telegram.*または*)をサポートします。

json
{
  "diagnostics": {
    "flags": ["telegram.http"]
  }
}

環境変数上書き(一回限り):

MAYROS_DIAGNOSTICS=telegram.http,telegram.payload

注意事項:

  • フラグログは標準ログファイルに記録されます(logging.fileと同じ)。
  • 出力はlogging.redactSensitiveに従ってリダクションされます。
  • 完全ガイド: /diagnostics/flags

OpenTelemetryへのエクスポート

診断はdiagnostics-otelプラグイン(OTLP/HTTP)経由でエクスポートできます。これは OTLP/HTTPを受け入れる任意のOpenTelemetryコレクター/バックエンドで動作します。

json
{
  "plugins": {
    "allow": ["diagnostics-otel"],
    "entries": {
      "diagnostics-otel": {
        "enabled": true
      }
    }
  },
  "diagnostics": {
    "enabled": true,
    "otel": {
      "enabled": true,
      "endpoint": "http://otel-collector:4318",
      "protocol": "http/protobuf",
      "serviceName": "mayros-gateway",
      "traces": true,
      "metrics": true,
      "logs": true,
      "sampleRate": 0.2,
      "flushIntervalMs": 60000
    }
  }
}

注意事項:

  • mayros plugins enable diagnostics-otelでプラグインを有効化することもできます。
  • protocolは現在http/protobufのみをサポートします。grpcは無視されます。
  • メトリクスには、トークン使用量、コスト、コンテキストサイズ、実行期間、およびメッセージフロー カウンター/ヒストグラム(Webhook、キューイング、セッション状態、キュー深度/待機)が含まれます。
  • トレース/メトリクスはtraces / metricsで切り替えられます(デフォルト:オン)。トレースには モデル使用スパンと、有効な場合のWebhook/メッセージ処理スパンが含まれます。
  • コレクターが認証を必要とする場合は、headersを設定します。
  • サポートされる環境変数: OTEL_EXPORTER_OTLP_ENDPOINTOTEL_SERVICE_NAMEOTEL_EXPORTER_OTLP_PROTOCOL

エクスポートされるメトリクス(名前 + 型)

モデル使用:

  • mayros.tokens(カウンター、attrs: mayros.tokenmayros.channelmayros.providermayros.model
  • mayros.cost.usd(カウンター、attrs: mayros.channelmayros.providermayros.model
  • mayros.run.duration_ms(ヒストグラム、attrs: mayros.channelmayros.providermayros.model
  • mayros.context.tokens(ヒストグラム、attrs: mayros.contextmayros.channelmayros.providermayros.model

メッセージフロー:

  • mayros.webhook.received(カウンター、attrs: mayros.channelmayros.webhook
  • mayros.webhook.error(カウンター、attrs: mayros.channelmayros.webhook
  • mayros.webhook.duration_ms(ヒストグラム、attrs: mayros.channelmayros.webhook
  • mayros.message.queued(カウンター、attrs: mayros.channelmayros.source
  • mayros.message.processed(カウンター、attrs: mayros.channelmayros.outcome
  • mayros.message.duration_ms(ヒストグラム、attrs: mayros.channelmayros.outcome

キュー + セッション:

  • mayros.queue.lane.enqueue(カウンター、attrs: mayros.lane
  • mayros.queue.lane.dequeue(カウンター、attrs: mayros.lane
  • mayros.queue.depth(ヒストグラム、attrs: mayros.laneまたは mayros.channel=heartbeat
  • mayros.queue.wait_ms(ヒストグラム、attrs: mayros.lane
  • mayros.session.state(カウンター、attrs: mayros.statemayros.reason
  • mayros.session.stuck(カウンター、attrs: mayros.state
  • mayros.session.stuck_age_ms(ヒストグラム、attrs: mayros.state
  • mayros.run.attempt(カウンター、attrs: mayros.attempt

エクスポートされるスパン(名前 + 主要属性)

  • mayros.model.usage
    • mayros.channelmayros.providermayros.model
    • mayros.sessionKeymayros.sessionId
    • mayros.tokens.*(input/output/cache_read/cache_write/total)
  • mayros.webhook.processed
    • mayros.channelmayros.webhookmayros.chatId
  • mayros.webhook.error
    • mayros.channelmayros.webhookmayros.chatIdmayros.error
  • mayros.message.processed
    • mayros.channelmayros.outcomemayros.chatIdmayros.messageIdmayros.sessionKeymayros.sessionIdmayros.reason
  • mayros.session.stuck
    • mayros.statemayros.ageMsmayros.queueDepthmayros.sessionKeymayros.sessionId

サンプリング + フラッシュ

  • トレースサンプリング: diagnostics.otel.sampleRate(0.0–1.0、ルートスパンのみ)。
  • メトリクスエクスポート間隔: diagnostics.otel.flushIntervalMs(最小1000ms)。

プロトコルノート

  • OTLP/HTTPエンドポイントは、diagnostics.otel.endpointまたは OTEL_EXPORTER_OTLP_ENDPOINT経由で設定できます。
  • エンドポイントに既に/v1/tracesまたは/v1/metricsが含まれている場合、そのまま使用されます。
  • エンドポイントに既に/v1/logsが含まれている場合、ログにそのまま使用されます。
  • diagnostics.otel.logsはメインロガー出力のOTLPログエクスポートを有効にします。

ログエクスポート動作

  • OTLPログは、logging.fileに書き込まれるのと同じ構造化レコードを使用します。
  • logging.level(ファイルログレベル)を尊重します。コンソールリダクションはOTLPログには 適用されません
  • 大量のインストールでは、OTLPコレクターのサンプリング/フィルタリングを優先する必要があります。

トラブルシューティングのヒント

  • Gatewayに到達できませんか? まずmayros doctorを実行してください。
  • ログが空ですか? Gatewayが実行中で、logging.fileのファイルパスに書き込んでいることを確認してください。
  • 詳細が必要ですか? logging.leveldebugまたはtraceに設定して再試行してください。