日志记录
Mayros 在两个地方记录日志:
- Gateway 写入的文件日志(JSON 行)。
- 终端和控制 UI 中显示的控制台输出。
本页说明日志的位置、如何读取以及如何配置日志级别和格式。
日志位置
默认情况下,Gateway 在以下位置写入滚动日志文件:
/tmp/mayros/mayros-YYYY-MM-DD.log
日期使用网关主机的本地时区。
您可以在 ~/.mayros/mayros.json 中覆盖此设置:
json{ "logging": { "file": "/path/to/mayros.log" } }
如何读取日志
CLI:实时跟踪(推荐)
使用 CLI 通过 RPC 跟踪网关日志文件:
bashmayros logs --follow
输出模式:
- TTY 会话:漂亮、彩色、结构化的日志行。
- 非 TTY 会话:纯文本。
--json:行分隔的 JSON(每行一个日志事件)。--plain:在 TTY 会话中强制使用纯文本。--no-color:禁用 ANSI 颜色。
在 JSON 模式下,CLI 发出 type 标记的对象:
meta:流元数据(文件、游标、大小)log:解析的日志条目notice:截断/轮转提示raw:未解析的日志行
如果 Gateway 无法访问,CLI 会打印一个简短提示以运行:
bashmayros doctor
控制 UI(web)
控制 UI 的 Logs 选项卡使用 logs.tail 跟踪同一文件。
有关如何打开它,请参阅 /web/control-ui。
仅渠道日志
要过滤渠道活动(WhatsApp/Telegram 等),请使用:
bashmayros channels logs --channel whatsapp
日志格式
文件日志(JSONL)
日志文件中的每一行都是一个 JSON 对象。CLI 和控制 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
诊断是模型运行和消息流遥测(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_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.*(输入/输出/缓存读/缓存写/总计)
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并重试。