跳转到内容

通用日志查询模式

除了按业务模块查询,日常排查更多是按日志级别、Trace ID、Session ID 等通用维度进行过滤。本文档提供可直接复用的查询模板。

所有日志均为 JSON 格式(zap JSON encoding),关键字段:

字段说明示例
level日志级别info, warn, error, debug, fatal
timeISO8601 时间戳2026-09-22T05:33:26.910Z
msg事件名称[turnagent] turn.end, [RPC] ->
trace_idOpenTelemetry Trace ID(自动注入)463b28fa9fd2b71c0c6355247e80f045
span_idOpenTelemetry Span ID(自动注入)531f76a1dc491cce
{service="server"} | json | level="warn"
{service="server"} | json | level="error"
{service="server"} | json | level="fatal"

查看 warn + error(排除 info 噪音)

Section titled “查看 warn + error(排除 info 噪音)”
{service="server"} | json | level=~"warn|error"
sum(count_over_time({service="server"} | json | level="error"[1m]))
topk(10,
count by (msg) ({service="server"} | json msg="msg" | level="error")
)

查看最近 5 分钟的 error 日志(带详情)

Section titled “查看最近 5 分钟的 error 日志(带详情)”
{service="server"} | json | level="error"

在 Grafana Explore 中设置时间范围为 now-5m 即可。

每条日志都自动包含 trace_id 和 span_id(来自 OpenTelemetry context),可以完整追踪一次请求的全链路。

{service="server"} | json trace_id="trace_id" | trace_id="463b28fa9fd2b71c0c6355247e80f045"

从 error 日志中提取 Trace ID,再追踪全链路

Section titled “从 error 日志中提取 Trace ID,再追踪全链路”
  1. 先找到 error:
{service="server"} | json trace_id="trace_id", msg="msg" | level="error"
  1. 取到 trace_id 后,查完整链路:
{service="server"} | json trace_id="trace_id" | trace_id="<从上面获取的值>"

同一个 trace_id 在多个服务间共享。在 Grafana Tempo 中搜索 trace_id 可以看到完整的跨服务调用链(HTTP → RPC → Agent → LLM)。

从 RPC 日志开始,取 trace_id:

{service="server"} | json trace_id="trace_id", method="method" | msg="[RPC] ->" | method="v1.rtc.submit_result"

然后用取到的 trace_id 查完整链路:

{service="server"} | json trace_id="trace_id" | trace_id="e6518062ef5d54ff05961e2a48d3e3c0"

session_id 是业务维度的核心关联字段。

{service="server"} | json session_id="session_id" | session_id="01a0c796-1ecc-72c9-80b9-b214e6ef6d68"
{service="server"} | json session_id="session_id" | level="error" | session_id="01a0c796-1ecc-72c9-80b9-b214e6ef6d68"
{service="server"} | json session_id="session_id" | level=~"warn|error" | session_id="01a0c796-1ecc-72c9-80b9-b214e6ef6d68"
topk(10,
count by (session_id) ({service="server"} | json session_id="session_id" | level="error")
)

turn_id 用于追踪单次 Turn 执行的全链路。

{service="server"} | json turn_id="turn_id" | turn_id="01a0c79c-adbb-73ae-818d-9c2b5b95cb5f"
{service="server"} | json turn_id="turn_id", duration_ms="duration_ms" | msg="[turnagent] turn.end" | turn_id="01a0c79c-adbb-73ae-818d-9c2b5b95cb5f"
{service="server"} | json user="user" | user="01a09047-0f11-7c36-8e08-74e6726fbbd3"
{service="server"} | json user="user" | level="error" | user="01a09047-0f11-7c36-8e08-74e6726fbbd3"

查找某个时间段内包含特定关键词的日志

Section titled “查找某个时间段内包含特定关键词的日志”
{service="server"} |= "timeout" | json

查找包含特定 error message 的日志

Section titled “查找包含特定 error message 的日志”
{service="server"} |= "connection refused" | json | level="error"
{service="server"} | json | level="warn" | msg !~ "non-fatal|best effort"

排查用户问题:按 Session + 时间 + 级别

Section titled “排查用户问题:按 Session + 时间 + 级别”
{service="server"} | json session_id="session_id", msg="msg" | level=~"warn|error" | session_id="<session-id>"

排查工具调用失败:按 Session + 关键词

Section titled “排查工具调用失败:按 Session + 关键词”
{service="server"} | json session_id="session_id" | level="warn" | msg=~"tool\\.call_failed|script.*failed" | session_id="<session-id>"

排查 LLM 异常:按 Session + Token 相关

Section titled “排查 LLM 异常:按 Session + Token 相关”
{service="server"} | json session_id="session_id" | msg=~"llm\\.complete|llm\\.http\\.error|token_callback" | session_id="<session-id>"

排查 RTC 全链路:从 Trace ID 追踪

Section titled “排查 RTC 全链路:从 Trace ID 追踪”
{service="server"} | json trace_id="trace_id", msg="msg" | trace_id="<trace-id>" | line_format "{{.msg}} | {{.level}}"

全局健康概览:最近 15 分钟 error 按模块分组

Section titled “全局健康概览:最近 15 分钟 error 按模块分组”
sum by (msg) (count_over_time({service="server"} | json msg="msg" | level="error"[15m]))

在 Grafana Explore 中使用 line_format 简化输出:

{service="server"} | json | level="error" | line_format "{{.time}} [{{.level}}] {{.msg}} | session={{.session_id}} | error={{.error}}"
{service="server"}
| json
| label_format level="{{.level}}"
| level="error"

在 Grafana 中,从 Loki 日志的 trace_id 字段可以直接点击跳转到 Tempo 查看完整分布式追踪链路。

开发环境下,日志同时写入 logs/debug.log(console 格式,更易读):

终端窗口
# 实时查看 error 日志
tail -f logs/debug.log | grep '"level":"error"'
# 按 session_id 过滤
tail -f logs/debug.log | grep '<session-id>'
# 按 trace_id 过滤
tail -f logs/debug.log | grep '<trace-id>'
# 按关键词过滤
tail -f logs/debug.log | grep 'timeout\|failed\|error'

LLM 完整请求/响应日志在 logs/llm-payload.log:

终端窗口
# 查看 LLM 请求错误
tail -f logs/llm-payload.log | grep 'llm.http.error'
# 查看特定 URL 的请求
tail -f logs/llm-payload.log | grep 'api.anthropic.com'