Files
qiming/qiming-rcoder/.qoder/repowiki/zh/content/故障排除/日志分析.md
2026-06-01 13:54:52 +08:00

9.6 KiB
Raw Permalink Blame History

日志分析

**本文档引用的文件** - [chat_handler.rs](file://crates/agent_runner/src/handler/chat_handler.rs) - [agent_service.rs](file://crates/agent_runner/src/proxy_agent/agent_service.rs) - [tracing_middleware.rs](file://crates/agent_runner/src/middleware/tracing_middleware.rs) - [chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs) - [tracing_middleware.rs](file://crates/rcoder/src/middleware/tracing_middleware.rs) - [main.rs](file://crates/agent_runner/src/main.rs) - [main.rs](file://crates/rcoder/src/main.rs) - [manager.rs](file://crates/docker_manager/src/manager.rs) - [container_manager.rs](file://crates/rcoder/src/service/container_manager.rs)

目录

  1. 日志结构与关键日志点
  2. Tracing与OpenTelemetry集成
  3. 关键操作日志记录模式
  4. 性能瓶颈与错误识别
  5. 日志级别配置与过滤
  6. Docker容器日志集成
  7. 端到端问题定位

日志结构与关键日志点

RCoder系统采用结构化日志记录结合tracingOpenTelemetry实现分布式追踪。日志系统在main.rs中初始化配置了文件和控制台双输出。文件日志采用JSON格式便于后续分析和监控系统集成。

日志文件按天滚动保存保留最近5天的日志文件文件名前缀分别为agent-runnerrcoder,分别对应不同的服务组件。日志目录自动创建于项目根目录下的logs文件夹中。

关键日志点包括:

  • HTTP请求的开始和结束
  • 容器创建、启动和停止
  • 代理服务的状态转换
  • 会话管理操作
  • 错误和异常处理

Section sources

Tracing与OpenTelemetry集成

系统通过tracing_middleware.rs实现了HTTP请求追踪中间件为每个请求生成唯一的trace_id并创建相应的span用于日志跟踪。中间件自动从请求头中提取trace_id,支持x-trace-idx-request-idtraceparent等常见追踪头。

sequenceDiagram
participant Client as "客户端"
participant Rcoder as "RCoder服务"
participant Agent as "AgentRunner服务"
Client->>Rcoder : POST /chat (带trace_id)
Rcoder->>Rcoder : 生成/提取trace_id
Rcoder->>Rcoder : 记录请求开始
Rcoder->>Agent : 转发请求 (传递trace_id)
Agent->>Agent : 记录代理处理
Agent-->>Rcoder : 返回响应
Rcoder->>Rcoder : 记录请求完成
Rcoder-->>Client : 返回响应

Diagram sources

Section sources

关键操作日志记录模式

HTTP入口日志记录

chat_handler.rsHTTP请求的处理过程有详细的日志记录。当处理聊天请求时系统会记录请求的开始、项目ID的生成、会话状态的检查等关键信息。

flowchart TD
Start([开始处理聊天请求]) --> Validate["验证请求参数"]
Validate --> CheckStatus["检查Agent状态"]
CheckStatus --> RemoveSession["移除旧会话"]
RemoveSession --> CreateWorkspace["创建项目工作目录"]
CreateWorkspace --> SelectAgent["选择Agent类型"]
SelectAgent --> SendTask["发送本地任务"]
SendTask --> AwaitResponse["等待代理响应"]
AwaitResponse --> HandleResult["处理响应结果"]
HandleResult --> End([返回响应])
style Start fill:#4CAF50,stroke:#388E3C
style End fill:#4CAF50,stroke:#388E3C

Diagram sources

Section sources

代理服务日志记录

agent_service.rs中,代理服务的启动和管理有明确的日志记录。系统通过AcpAgentService trait定义了统一的接口不同类型的代理如Claude、Codex实现该接口。

classDiagram
class AcpAgentService {
<<trait>>
+start_agent_service(chat_prompt, model_provider) Result~AcpConnectionInfo~
+agent_type_name() &'static str
}
class AgentType {
+Claude
+Codex
}
AcpAgentService <|-- AgentType : "实现"
AgentType --> "ClaudeCodeAgent" : "调用"
AgentType --> "CodexAgent" : "调用"

Diagram sources

Section sources

性能瓶颈与错误识别

性能瓶颈识别

通过分析日志中的时间戳和处理时长,可以识别系统性能瓶颈。关键的性能指标包括:

  • HTTP请求处理时间
  • 容器创建和启动时间
  • 代理服务响应时间
  • 网络通信延迟

日志中的emoji标记有助于快速识别不同类型的日志

  • 🚀 表示开始处理
  • 表示成功完成
  • 表示错误或失败
  • ⚠️ 表示警告或需要注意的情况

错误堆栈分析

系统在关键错误点记录详细的错误信息,包括错误代码、消息和堆栈跟踪。例如,在chat_handler.rs中,当代理处理失败时,系统会记录错误详情:

flowchart LR
A[收到代理执行结果] --> B{结果是否成功?}
B --> |是| C[检查响应错误]
C --> D{有错误?}
D --> |是| E[记录错误日志]
D --> |否| F[记录成功日志]
B --> |否| G[记录接收失败日志]
style E fill:#f44336,stroke:#d32f2f
style G fill:#f44336,stroke:#d32f2f

Diagram sources

Section sources

日志级别配置与过滤

日志级别配置

系统通过tracing_subscriber::EnvFilter配置日志级别,支持环境变量配置。默认配置如下:

  • rcoder=debugRCoder组件的调试级别
  • tower_http=debugHTTP中间件的调试级别
  • axum_tracing_opentelemetry=infoOpenTelemetry追踪的普通级别

日志过滤技巧

可以通过环境变量RUST_LOG来动态调整日志级别,例如:

# 只显示错误日志
export RUST_LOG=error

# 显示RCoder组件的调试日志
export RUST_LOG=rcoder=debug

# 显示所有组件的详细日志
export RUST_LOG=debug

Section sources

Docker容器日志集成

容器管理日志

docker_manager模块提供了完整的容器管理功能,包括创建、启动、停止和清理容器。每个操作都有相应的日志记录:

sequenceDiagram
participant Rcoder as "RCoder服务"
participant Docker as "Docker守护进程"
Rcoder->>Docker : 创建容器
Docker-->>Rcoder : 返回容器ID
Rcoder->>Rcoder : 记录容器创建
Rcoder->>Docker : 启动容器
Docker-->>Rcoder : 启动成功
Rcoder->>Rcoder : 记录容器启动
Rcoder->>Docker : 检查容器健康
Docker-->>Rcoder : 健康状态
Rcoder->>Rcoder : 记录健康检查

Diagram sources

Section sources

容器日志获取

系统提供了获取容器日志的功能,可以通过get_container_logs方法获取指定容器的日志:

flowchart TD
A[获取容器日志] --> B{容器是否存在?}
B --> |是| C[调用Docker API]
C --> D[获取日志流]
D --> E[合并日志内容]
E --> F[返回日志字符串]
B --> |否| G[返回错误]
style G fill:#f44336,stroke:#d32f2f

Diagram sources

Section sources

端到端问题定位

请求生命周期追踪

通过trace_id可以追踪请求从HTTP入口到代理执行的完整生命周期。系统在chat_handler.rs中实现了请求转发,保持了trace_id的传递:

sequenceDiagram
participant Client as "客户端"
participant Rcoder as "RCoder服务"
participant Container as "Agent容器"
Client->>Rcoder : 发送请求 (带trace_id)
Rcoder->>Rcoder : 记录请求开始
Rcoder->>Container : 转发请求 (传递trace_id)
Container->>Container : 处理请求
Container-->>Rcoder : 返回响应
Rcoder->>Rcoder : 记录请求完成
Rcoder-->>Client : 返回响应

Diagram sources

Section sources

状态转换异常检测

系统通过日志记录关键状态的转换,可以检测异常状态。例如,在容器管理中,系统会检查容器的健康状态:

stateDiagram-v2
[*] --> Idle
Idle --> Creating : "创建容器"
Creating --> Running : "启动成功"
Creating --> Error : "启动失败"
Running --> Stopped : "停止容器"
Running --> Error : "健康检查失败"
Stopped --> Idle : "清理完成"
Error --> Idle : "错误处理"

Diagram sources

Section sources