日志配置
日志
OpenClaw 在两个地方记录日志:
- 文件日志(JSON 行)由 Gateway 写入
- 控制台输出 显示在终端和控制台 UI 中
本文档解释日志的位置、如何读取它们,以及如何配置日志级别和格式。
日志位置
默认情况下,Gateway 将滚动日志文件写入:
/tmp/openclaw/openclaw-YYYY-MM-DD.log
日期使用 Gateway 主机的本地时区。
你可以在 ~/.openclaw/openclaw.json 中覆盖此设置:
{
"logging": {
"file": "/path/to/openclaw.log"
}
}
如何读取日志
CLI:实时跟踪(推荐)
使用 CLI 通过 RPC 跟踪 Gateway 日志文件:
openclaw logs --follow
输出模式:
- TTY 会话:美观、彩色、结构化的日志行
- 非 TTY 会话:纯文本
--json:换行分隔的 JSON(每行一个日志事件)--plain:在 TTY 会话中强制纯文本--no-color:禁用 ANSI 颜色
在 JSON 模式下,CLI 发出带 type 标签的对象:
meta:流元数据(文件、游标、大小)log:解析的日志条目notice:截断/轮换提示raw:未解析的日志行
如果 Gateway 不可达,CLI 会打印一个简短提示来运行:
openclaw doctor
控制台 UI(网页)
控制台 UI 的 Logs 标签页使用 logs.tail 跟踪同一文件。
打开方式详见 /web/control-ui。
仅频道日志
要过滤频道活动(WhatsApp/Telegram 等),使用:
openclaw channels logs --channel whatsapp
日志格式
文件日志(JSONL)
日志文件中的每一行都是一个 JSON 对象。CLI 和控制台 UI 解析这些条目以渲染结构化输出(时间、级别、子系统、消息)。
控制台输出
控制台日志是 TTY 感知 的,并为可读性格式化:
- 子系统前缀(例如
gateway/channels/whatsapp) - 级别着色(info/warn/error)
- 可选的紧凑或 JSON 模式
控制台格式由 logging.consoleStyle 控制。
配置日志
所有日志配置都位于 ~/.openclaw/openclaw.json 的 logging 下。
{
"logging": {
"level": "info",
"file": "/tmp/openclaw/openclaw-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 数据导出到收集器/后端的线协议
- OpenClaw 目前通过 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/队列/会话)
启用诊断(无导出器)
如果你希望诊断事件可用于插件或自定义接收器,使用此选项:
{
"diagnostics": {
"enabled": true
}
}
诊断标志(有针对性的日志)
使用标志在不提高 logging.level 的情况下打开额外的有针对性的调试日志。标志不区分大小写,支持通配符(例如 telegram.* 或 *)。
{
"diagnostics": {
"flags": ["telegram.http"]
}
}
环境变量覆盖(一次性):
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload
注意:
- 标志日志进入标准日志文件(与
logging.file相同) - 仍根据
logging.redactSensitive进行脱敏 - 完整指南:/diagnostics/flags
导出到 OpenTelemetry
诊断可以通过 diagnostics-otel 插件(OTLP/HTTP)导出。这适用于任何接受 OTLP/HTTP 的 OpenTelemetry 收集器/后端。
{
"plugins": {
"allow": ["diagnostics-otel"],
"entries": {
"diagnostics-otel": {
"enabled": true
}
}
},
"diagnostics": {
"enabled": true,
"otel": {
"enabled": true,
"endpoint": "http://otel-collector:4318",
"protocol": "http/protobuf",
"serviceName": "openclaw-gateway",
"traces": true,
"metrics": true,
"logs": true,
"sampleRate": 0.2,
"flushIntervalMs": 60000
}
}
}
注意:
- 你也可以用
openclaw plugins enable diagnostics-otel启用插件 protocol目前仅支持http/protobuf。grpc被忽略- 指标包括令牌使用、成本、上下文大小、运行持续时间,以及消息流计数器/直方图(webhook、队列、会话状态、队列深度/等待)
- 跟踪/指标可以用
traces/metrics切换(默认:开启) - 跟踪包括模型使用跨度加上 webhook/消息处理跨度(启用时)
- 当收集器需要认证时设置
headers - 支持的环境变量:
OTEL_EXPORTER_OTLP_ENDPOINT、OTEL_SERVICE_NAME、OTEL_EXPORTER_OTLP_PROTOCOL
导出的指标(名称 + 类型)
模型使用:
openclaw.tokens(计数器,属性:openclaw.token,openclaw.channel,openclaw.provider,openclaw.model)openclaw.cost.usd(计数器,属性:openclaw.channel,openclaw.provider,openclaw.model)openclaw.run.duration_ms(直方图,属性:openclaw.channel,openclaw.provider,openclaw.model)openclaw.context.tokens(直方图,属性:openclaw.context,openclaw.channel,openclaw.provider,openclaw.model)
消息流:
openclaw.webhook.received(计数器,属性:openclaw.channel,openclaw.webhook)openclaw.webhook.error(计数器,属性:openclaw.channel,openclaw.webhook)openclaw.webhook.duration_ms(直方图,属性:openclaw.channel,openclaw.webhook)openclaw.message.queued(计数器,属性:openclaw.channel,openclaw.source)openclaw.message.processed(计数器,属性:openclaw.channel,openclaw.outcome)openclaw.message.duration_ms(直方图,属性:openclaw.channel,openclaw.outcome)
队列 + 会话:
openclaw.queue.lane.enqueue(计数器,属性:openclaw.lane)openclaw.queue.lane.dequeue(计数器,属性:openclaw.lane)openclaw.queue.depth(直方图,属性:openclaw.lane或openclaw.channel=heartbeat)openclaw.queue.wait_ms(直方图,属性:openclaw.lane)openclaw.session.state(计数器,属性:openclaw.state,openclaw.reason)openclaw.session.stuck(计数器,属性:openclaw.state)openclaw.session.stuck_age_ms(直方图,属性:openclaw.state)openclaw.run.attempt(计数器,属性:openclaw.attempt)
导出的跨度(名称 + 关键属性)
openclaw.model.usageopenclaw.channel,openclaw.provider,openclaw.modelopenclaw.sessionKey,openclaw.sessionIdopenclaw.tokens.*(input/output/cache_read/cache_write/total)
openclaw.webhook.processedopenclaw.channel,openclaw.webhook,openclaw.chatId
openclaw.webhook.erroropenclaw.channel,openclaw.webhook,openclaw.chatId,openclaw.error
openclaw.message.processedopenclaw.channel,openclaw.outcome,openclaw.chatId,openclaw.messageId,openclaw.sessionKey,openclaw.sessionId,openclaw.reason
openclaw.session.stuckopenclaw.state,openclaw.ageMs,openclaw.queueDepth,openclaw.sessionKey,openclaw.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 不可达? 先运行
openclaw doctor - 日志为空? 检查 Gateway 是否正在运行并写入
logging.file中的文件路径 - 需要更多细节? 将
logging.level设置为debug或trace然后重试