로깅
Mayros는 두 곳에 로그를 기록합니다:
- Gateway가 작성하는 파일 로그 (JSON 줄).
- 터미널 및 Control UI에 표시되는 콘솔 출력.
이 페이지에서는 로그의 위치, 읽는 방법, 로그 레벨 및 형식을 구성하는 방법을 설명합니다.
로그 위치
기본적으로 Gateway는 다음 위치에 롤링 로그 파일을 작성합니다:
/tmp/mayros/mayros-YYYY-MM-DD.log
날짜는 게이트웨이 호스트의 로컬 시간대를 사용합니다.
~/.mayros/mayros.json에서 이를 재정의할 수 있습니다:
json{ "logging": { "file": "/path/to/mayros.log" } }
로그 읽기 방법
CLI: 실시간 tail (권장)
CLI를 사용하여 RPC를 통해 게이트웨이 로그 파일을 tail하세요:
bashmayros logs --follow
출력 모드:
- TTY 세션: 예쁘고 색상이 지정되고 구조화된 로그 줄.
- 비TTY 세션: 일반 텍스트.
--json: 줄로 구분된 JSON (로그 이벤트당 한 줄).--plain: TTY 세션에서 일반 텍스트 강제 사용.--no-color: ANSI 색상 비활성화.
JSON 모드에서 CLI는 type 태그가 지정된 객체를 내보냅니다:
meta: 스트림 메타데이터 (파일, 커서, 크기)log: 파싱된 로그 항목notice: 잘림 / 순환 힌트raw: 파싱되지 않은 로그 줄
Gateway에 연결할 수 없는 경우 CLI는 다음을 실행하라는 짧은 힌트를 출력합니다:
bashmayros doctor
Control UI (웹)
Control UI의 Logs 탭은 logs.tail을 사용하여 동일한 파일을 tail합니다.
여는 방법은 /web/control-ui를 참조하세요.
채널 전용 로그
채널 활동(WhatsApp/Telegram 등)을 필터링하려면 다음을 사용하세요:
bashmayros channels logs --channel whatsapp
로그 형식
파일 로그 (JSONL)
로그 파일의 각 줄은 JSON 객체입니다. CLI 및 Control UI는 이러한 항목을 파싱하여 구조화된 출력(시간, 레벨, 하위 시스템, 메시지)을 렌더링합니다.
콘솔 출력
콘솔 로그는 TTY 인식이며 가독성을 위해 형식이 지정됩니다:
- 하위 시스템 접두사 (예:
gateway/channels/whatsapp) - 레벨 색상 지정 (info/warn/error)
- 선택적 컴팩트 또는 JSON 모드
콘솔 형식은 logging.consoleStyle에 의해 제어됩니다.
로깅 구성
모든 로깅 구성은 ~/.mayros/mayros.json의 logging 아래에 있습니다.
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: 줄당 JSON (로그 프로세서용).
편집
도구 요약은 콘솔에 도달하기 전에 민감한 토큰을 편집할 수 있습니다:
logging.redactSensitive:off|tools(기본값:tools)logging.redactPatterns: 기본 세트를 재정의하는 정규식 문자열 목록
편집은 콘솔 출력에만 영향을 미치며 파일 로그를 변경하지 않습니다.
진단 + OpenTelemetry
진단은 모델 실행 및 메시지 흐름 원격 측정(웹훅, 대기열, 세션 상태)에 대한 구조화되고 기계 판독 가능한 이벤트입니다. 로그를 대체하지 않습니다. 메트릭, 추적 및 기타 내보내기 프로그램을 공급하기 위해 존재합니다.
진단 이벤트는 프로세스 내에서 내보내지지만 내보내기 프로그램은 진단 + 내보내기 프로그램 플러그인이 활성화된 경우에만 연결됩니다.
OpenTelemetry vs OTLP
- OpenTelemetry (OTel): 추적, 메트릭 및 로그를 위한 데이터 모델 + SDK.
- OTLP: OTel 데이터를 수집기/백엔드로 내보내는 데 사용되는 유선 프로토콜.
- Mayros는 현재 **OTLP/HTTP (protobuf)**를 통해 내보냅니다.
내보낸 신호
- 메트릭: 카운터 + 히스토그램 (토큰 사용량, 메시지 흐름, 대기열).
- 추적: 모델 사용량 + 웹훅/메시지 처리를 위한 스팬.
- 로그:
diagnostics.otel.logs가 활성화된 경우 OTLP를 통해 내보내집니다. 로그 볼륨이 높을 수 있습니다.logging.level및 내보내기 프로그램 필터를 염두에 두세요.
진단 이벤트 카탈로그
모델 사용량:
model.usage: 토큰, 비용, 기간, 컨텍스트, 공급자/모델/채널, 세션 ID.
메시지 흐름:
webhook.received: 채널당 웹훅 수신.webhook.processed: 웹훅 처리 + 기간.webhook.error: 웹훅 핸들러 오류.message.queued: 처리를 위해 대기 중인 메시지.message.processed: 결과 + 기간 + 선택적 오류.
대기열 + 세션:
queue.lane.enqueue: 명령 대기열 레인 enqueue + 깊이.queue.lane.dequeue: 명령 대기열 레인 dequeue + 대기 시간.session.state: 세션 상태 전환 + 이유.session.stuck: 세션 스턱 경고 + 나이.run.attempt: 실행 재시도/시도 메타데이터.diagnostic.heartbeat: 집계 카운터 (웹훅/대기열/세션).
진단 활성화 (내보내기 프로그램 없음)
플러그인 또는 사용자 정의 싱크에서 진단 이벤트를 사용할 수 있도록 하려면 다음을 사용하세요:
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는 무시됩니다.- 메트릭에는 토큰 사용량, 비용, 컨텍스트 크기, 실행 기간 및 메시지 흐름 카운터/히스토그램(웹훅, 대기열, 세션 상태, 대기열 깊이/대기)이 포함됩니다.
- 추적/메트릭은
traces/metrics로 토글할 수 있습니다(기본값: on). 추적에는 활성화된 경우 모델 사용량 스팬과 웹훅/메시지 처리 스팬이 포함됩니다. - 수집기에 인증이 필요한 경우
headers를 설정하세요. - 지원되는 환경 변수:
OTEL_EXPORTER_OTLP_ENDPOINT,OTEL_SERVICE_NAME,OTEL_EXPORTER_OTLP_PROTOCOL.
내보낸 메트릭 (이름 + 유형)
모델 사용량:
mayros.tokens(카운터, 속성:mayros.token,mayros.channel,mayros.provider,mayros.model)mayros.cost.usd(카운터, 속성:mayros.channel,mayros.provider,mayros.model)mayros.run.duration_ms(히스토그램, 속성:mayros.channel,mayros.provider,mayros.model)mayros.context.tokens(히스토그램, 속성:mayros.context,mayros.channel,mayros.provider,mayros.model)
메시지 흐름:
mayros.webhook.received(카운터, 속성:mayros.channel,mayros.webhook)mayros.webhook.error(카운터, 속성:mayros.channel,mayros.webhook)mayros.webhook.duration_ms(히스토그램, 속성:mayros.channel,mayros.webhook)mayros.message.queued(카운터, 속성:mayros.channel,mayros.source)mayros.message.processed(카운터, 속성:mayros.channel,mayros.outcome)mayros.message.duration_ms(히스토그램, 속성:mayros.channel,mayros.outcome)
대기열 + 세션:
mayros.queue.lane.enqueue(카운터, 속성:mayros.lane)mayros.queue.lane.dequeue(카운터, 속성:mayros.lane)mayros.queue.depth(히스토그램, 속성:mayros.lane또는mayros.channel=heartbeat)mayros.queue.wait_ms(히스토그램, 속성:mayros.lane)mayros.session.state(카운터, 속성:mayros.state,mayros.reason)mayros.session.stuck(카운터, 속성:mayros.state)mayros.session.stuck_age_ms(히스토그램, 속성:mayros.state)mayros.run.attempt(카운터, 속성:mayros.attempt)
내보낸 스팬 (이름 + 주요 속성)
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
샘플링 + 플러싱
- 추적 샘플링:
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.level을debug또는trace로 설정하고 다시 시도하세요.