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:
bashmayros 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 logunotice: wskazówki obcięcia / rotacjiraw: nie sparsowana linia logu
Jeśli Gateway jest niedostępny, CLI wyświetla krótką wskazówkę do uruchomienia:
bashmayros 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:
bashmayros 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.logsjest włączony. Objętość logów może być wysoka; pamiętaj ologging.leveli 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. protocolobecnie obsługuje tylkohttp/protobuf.grpcjest 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
headersgdy 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.lanelubmayros.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.usagemayros.channel,mayros.provider,mayros.modelmayros.sessionKey,mayros.sessionIdmayros.tokens.*(input/output/cache_read/cache_write/total)
mayros.webhook.processedmayros.channel,mayros.webhook,mayros.chatId
mayros.webhook.errormayros.channel,mayros.webhook,mayros.chatId,mayros.error
mayros.message.processedmayros.channel,mayros.outcome,mayros.chatId,mayros.messageId,mayros.sessionKey,mayros.sessionId,mayros.reason
mayros.session.stuckmayros.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.endpointlubOTEL_EXPORTER_OTLP_ENDPOINT. - Jeśli endpoint już zawiera
/v1/traceslub/v1/metrics, jest używany jak jest. - Jeśli endpoint już zawiera
/v1/logs, jest używany jak jest dla logów. diagnostics.otel.logswłą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.levelnadebuglubtracei spróbuj ponownie.