9.6 KiB
日志分析
**本文档引用的文件** - [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)目录
日志结构与关键日志点
RCoder系统采用结构化日志记录,结合tracing和OpenTelemetry实现分布式追踪。日志系统在main.rs中初始化,配置了文件和控制台双输出。文件日志采用JSON格式,便于后续分析和监控系统集成。
日志文件按天滚动保存,保留最近5天的日志文件,文件名前缀分别为agent-runner和rcoder,分别对应不同的服务组件。日志目录自动创建于项目根目录下的logs文件夹中。
关键日志点包括:
- HTTP请求的开始和结束
- 容器创建、启动和停止
- 代理服务的状态转换
- 会话管理操作
- 错误和异常处理
Section sources
Tracing与OpenTelemetry集成
系统通过tracing_middleware.rs实现了HTTP请求追踪中间件,为每个请求生成唯一的trace_id,并创建相应的span用于日志跟踪。中间件自动从请求头中提取trace_id,支持x-trace-id、x-request-id、traceparent等常见追踪头。
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.rs中,HTTP请求的处理过程有详细的日志记录。当处理聊天请求时,系统会记录请求的开始、项目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=debug:RCoder组件的调试级别tower_http=debug:HTTP中间件的调试级别axum_tracing_opentelemetry=info:OpenTelemetry追踪的普通级别
日志过滤技巧
可以通过环境变量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