Logowanie

Mayros loguje w dwóch miejscach:

  • Logi plików (linie JSON) zapisywane przez Gateway.
  • Wyjście konsoli wyświetlane w terminalach i interfejsie sterowania.

Ta strona wyjaśnia, gdzie znajdują się logi, jak je czytać i jak konfigurować poziomy logów i formaty.

Gdzie znajdują się logi

Domyślnie Gateway zapisuje obracający się plik logów pod:

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

Data używa lokalnej strefy czasowej hosta gateway.

Możesz to zmienić w ~/.mayros/mayros.json:

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

Jak czytać logi

CLI: śledzenie na żywo (zalecane)

Użyj CLI do śledzenia pliku logów gateway przez RPC:

bash
mayros logs --follow

Tryby wyjścia:

  • Sesje TTY: ładne, kolorowe, strukturalne linie logów.
  • Sesje non-TTY: zwykły tekst.
  • --json: linie rozdzielone JSON (jedno zdarzenie logowania na linię).
  • --plain: wymuś zwykły tekst w sesjach TTY.
  • --no-color: wyłącz kolory ANSI.

W trybie JSON, CLI emituje obiekty oznaczone type:

  • meta: metadane strumienia (plik, kursor, rozmiar)
  • log: sparsowany wpis logu
  • notice: wskazówki obcięcia / rotacji
  • raw: nie sparsowana linia logu

Jeśli Gateway jest niedostępny, CLI wyświetla krótką wskazówkę do uruchomienia:

bash
mayros doctor

Interfejs sterowania (web)

Zakładka Logs interfejsu sterowania śledzi ten sam plik używając logs.tail. Zobacz /web/control-ui jak go otworzyć.

Logi tylko kanałów

Aby filtrować aktywność kanałów (WhatsApp/Telegram/itp.), użyj:

bash
mayros channels logs --channel whatsapp

Formaty logów

Logi plików (JSONL)

Każda linia w pliku logów to obiekt JSON. CLI i interfejs sterowania parsują te wpisy, aby renderować strukturalne wyjście (czas, poziom, podsystem, wiadomość).

Wyjście konsoli

Logi konsoli są świadome TTY i sformatowane dla czytelności:

  • Prefiksy podsystemów (np. gateway/channels/whatsapp)
  • Kolorowanie poziomów (info/warn/error)
  • Opcjonalny tryb kompaktowy lub JSON

Formatowanie konsoli jest kontrolowane przez logging.consoleStyle.

Konfiguracja logowania

Cała konfiguracja logowania znajduje się pod logging w ~/.mayros/mayros.json.

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

Poziomy logów

  • logging.level: poziom logów plików (JSONL).
  • logging.consoleLevel: poziom szczegółowości konsoli.

--verbose wpływa tylko na wyjście konsoli; nie zmienia poziomów logów plików.

Style konsoli

logging.consoleStyle:

  • pretty: przyjazny dla człowieka, kolorowy, ze znacznikami czasu.
  • compact: bardziej zwarty wynik (najlepszy dla długich sesji).
  • json: JSON na linię (dla procesorów logów).

Redakcja

Podsumowania narzędzi mogą redagować wrażliwe tokeny zanim trafią do konsoli:

  • logging.redactSensitive: off | tools (domyślnie: tools)
  • logging.redactPatterns: lista ciągów regex do nadpisania domyślnego zestawu

Redakcja wpływa tylko na wyjście konsoli i nie zmienia logów plików.

Diagnostyka + OpenTelemetry

Diagnostyka to strukturalne, czytelne dla maszyny zdarzenia dla uruchomień modelu i telemetrii przepływu wiadomości (webhooki, kolejkowanie, stan sesji). Nie zastępują logów; istnieją, aby zasilać metryki, ślady i inne eksportery.

Zdarzenia diagnostyczne są emitowane w procesie, ale eksportery dołączają się tylko, gdy diagnostyka + wtyczka eksportera są włączone.

OpenTelemetry vs OTLP

  • OpenTelemetry (OTel): model danych + SDK dla śladów, metryk i logów.
  • OTLP: protokół przewodowy używany do eksportu danych OTel do kolektora/backendu.
  • Mayros eksportuje przez OTLP/HTTP (protobuf) obecnie.

Eksportowane sygnały

  • Metryki: liczniki + histogramy (użycie tokenów, przepływ wiadomości, kolejkowanie).
  • Ślady: spany dla użycia modelu + przetwarzania webhook/wiadomości.
  • Logi: eksportowane przez OTLP gdy diagnostics.otel.logs jest włączony. Objętość logów może być wysoka; pamiętaj o logging.level i filtrach eksportera.

Katalog zdarzeń diagnostycznych

Użycie modelu:

  • model.usage: tokeny, koszt, czas trwania, kontekst, dostawca/model/kanał, identyfikatory sesji.

Przepływ wiadomości:

  • webhook.received: wejście webhooka na kanał.
  • webhook.processed: webhook obsłużony + czas trwania.
  • webhook.error: błędy obsługi webhooka.
  • message.queued: wiadomość w kolejce do przetworzenia.
  • message.processed: wynik + czas trwania + opcjonalny błąd.

Kolejka + sesja:

  • queue.lane.enqueue: kolejkowanie ścieżki kolejki poleceń + głębokość.
  • queue.lane.dequeue: usuwanie z kolejki ścieżki kolejki poleceń + czas oczekiwania.
  • session.state: przejście stanu sesji + powód.
  • session.stuck: ostrzeżenie o zawieszeniu sesji + wiek.
  • run.attempt: metadane ponowienia/próby uruchomienia.
  • diagnostic.heartbeat: zagregowane liczniki (webhooki/kolejka/sesja).

Włączanie diagnostyki (bez eksportera)

Użyj tego, jeśli chcesz, aby zdarzenia diagnostyczne były dostępne dla wtyczek lub niestandardowych ujść:

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

Flagi diagnostyczne (ukierunkowane logi)

Użyj flag, aby włączyć dodatkowe, ukierunkowane logi debugowania bez podnoszenia logging.level. Flagi nie rozróżniają wielkości liter i obsługują symbole wieloznaczne (np. telegram.* lub *).

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

Nadpisanie env (jednorazowe):

MAYROS_DIAGNOSTICS=telegram.http,telegram.payload

Uwagi:

  • Logi flag trafiają do standardowego pliku logów (ten sam co logging.file).
  • Wyjście jest nadal redagowane zgodnie z logging.redactSensitive.
  • Pełny przewodnik: /diagnostics/flags.

Eksport do OpenTelemetry

Diagnostyka może być eksportowana przez wtyczkę diagnostics-otel (OTLP/HTTP). Działa to z dowolnym kolektorem/backendem OpenTelemetry, który akceptuje OTLP/HTTP.

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
    }
  }
}

Uwagi:

  • Możesz również włączyć wtyczkę za pomocą mayros plugins enable diagnostics-otel.
  • protocol obecnie obsługuje tylko http/protobuf. grpc jest ignorowane.
  • Metryki obejmują użycie tokenów, koszt, rozmiar kontekstu, czas trwania uruchomienia i liczniki/histogramy przepływu wiadomości (webhooki, kolejkowanie, stan sesji, głębokość kolejki/oczekiwanie).
  • Ślady/metryki mogą być przełączane za pomocą traces / metrics (domyślnie: włączone). Ślady obejmują spany użycia modelu plus spany przetwarzania webhook/wiadomości gdy włączone.
  • Ustaw headers gdy twój kolektor wymaga uwierzytelnienia.
  • Obsługiwane zmienne środowiskowe: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_PROTOCOL.

Eksportowane metryki (nazwy + typy)

Użycie modelu:

  • mayros.tokens (licznik, atrybuty: mayros.token, mayros.channel, mayros.provider, mayros.model)
  • mayros.cost.usd (licznik, atrybuty: mayros.channel, mayros.provider, mayros.model)
  • mayros.run.duration_ms (histogram, atrybuty: mayros.channel, mayros.provider, mayros.model)
  • mayros.context.tokens (histogram, atrybuty: mayros.context, mayros.channel, mayros.provider, mayros.model)

Przepływ wiadomości:

  • mayros.webhook.received (licznik, atrybuty: mayros.channel, mayros.webhook)
  • mayros.webhook.error (licznik, atrybuty: mayros.channel, mayros.webhook)
  • mayros.webhook.duration_ms (histogram, atrybuty: mayros.channel, mayros.webhook)
  • mayros.message.queued (licznik, atrybuty: mayros.channel, mayros.source)
  • mayros.message.processed (licznik, atrybuty: mayros.channel, mayros.outcome)
  • mayros.message.duration_ms (histogram, atrybuty: mayros.channel, mayros.outcome)

Kolejki + sesje:

  • mayros.queue.lane.enqueue (licznik, atrybuty: mayros.lane)
  • mayros.queue.lane.dequeue (licznik, atrybuty: mayros.lane)
  • mayros.queue.depth (histogram, atrybuty: mayros.lane lub mayros.channel=heartbeat)
  • mayros.queue.wait_ms (histogram, atrybuty: mayros.lane)
  • mayros.session.state (licznik, atrybuty: mayros.state, mayros.reason)
  • mayros.session.stuck (licznik, atrybuty: mayros.state)
  • mayros.session.stuck_age_ms (histogram, atrybuty: mayros.state)
  • mayros.run.attempt (licznik, atrybuty: mayros.attempt)

Eksportowane spany (nazwy + kluczowe atrybuty)

  • mayros.model.usage
    • mayros.channel, mayros.provider, mayros.model
    • mayros.sessionKey, mayros.sessionId
    • mayros.tokens.* (input/output/cache_read/cache_write/total)
  • mayros.webhook.processed
    • mayros.channel, mayros.webhook, mayros.chatId
  • mayros.webhook.error
    • mayros.channel, mayros.webhook, mayros.chatId, mayros.error
  • mayros.message.processed
    • mayros.channel, mayros.outcome, mayros.chatId, mayros.messageId, mayros.sessionKey, mayros.sessionId, mayros.reason
  • mayros.session.stuck
    • mayros.state, mayros.ageMs, mayros.queueDepth, mayros.sessionKey, mayros.sessionId

Próbkowanie + opróżnianie

  • Próbkowanie śladów: diagnostics.otel.sampleRate (0.0–1.0, tylko korzenie spanów).
  • Interwał eksportu metryk: diagnostics.otel.flushIntervalMs (min 1000ms).

Uwagi dotyczące protokołu

  • Endpointy OTLP/HTTP mogą być ustawione przez diagnostics.otel.endpoint lub OTEL_EXPORTER_OTLP_ENDPOINT.
  • Jeśli endpoint już zawiera /v1/traces lub /v1/metrics, jest używany jak jest.
  • Jeśli endpoint już zawiera /v1/logs, jest używany jak jest dla logów.
  • diagnostics.otel.logs włącza eksport logów OTLP dla głównego wyjścia loggera.

Zachowanie eksportu logów

  • Logi OTLP używają tych samych strukturalnych rekordów zapisanych do logging.file.
  • Respektuj logging.level (poziom logów plików). Redakcja konsoli nie dotyczy logów OTLP.
  • Instalacje o dużym woluminie powinny preferować próbkowanie/filtrowanie kolektora OTLP.

Wskazówki dotyczące rozwiązywania problemów

  • Gateway niedostępny? Najpierw uruchom mayros doctor.
  • Logi puste? Sprawdź, czy Gateway działa i zapisuje do ścieżki pliku w logging.file.
  • Potrzebujesz więcej szczegółów? Ustaw logging.level na debug lub trace i spróbuj ponownie.