GitHub_Trending/co/computer-use-preview日志系统详解:调试与问题定位最佳实践
在日常开发和运维过程中,日志系统是排查问题、优化性能的关键工具。GitHub_Trending/co/computer-use-preview项目的日志系统虽然未采用专业日志框架,但通过精心设计的打印语句和状态跟踪机制,依然能够有效支持调试与问题定位。本文将详细解析该项目的日志实现方式,帮助开发者快速掌握调试技巧和最佳实践。
日志系统架构概览
GitHub_Trending/co/computer-use-preview项目的日志系统主要通过print函数和termcolor库实现,核心代码集中在agent.py文件中。系统采用分层日志策略,将日志信息分为普通打印、彩色提示和表格输出三种类型,分别用于不同场景的信息展示。
日志类型分布
| 日志类型 | 实现方式 | 应用场景 | 代码位置 |
|---|---|---|---|
| 普通打印 | print() |
基本状态信息、错误详情 | agent.py |
| 彩色提示 | termcolor.cprint() |
警告、错误等重要信息 | agent.py |
| 表格输出 | rich.table.Table |
结构化数据展示 | agent.py |
日志流程控制
日志系统与代理循环紧密集成,形成完整的信息反馈机制。主要流程如下:
graph TD
A[开始代理循环] --> B[生成模型响应]
B --> C{是否成功}
C -->|是| D[提取推理和函数调用]
C -->|否| E[打印错误信息并重试]
D --> F[判断是否有函数调用]
F -->|是| G[执行函数并记录日志]
F -->|否| H[打印完成信息并退出]
G --> I[更新环境状态]
I --> B
关键日志实现解析
错误处理与重试机制
项目在agent.py的get_model_response方法中实现了带重试机制的错误处理,通过print输出异常信息,并使用指数退避策略进行重试:
def get_model_response(
self, max_retries=5, base_delay_s=1
) -> types.GenerateContentResponse:
for attempt in range(max_retries):
try:
response = self._client.models.generate_content(
model=self._model_name,
contents=self._contents,
config=self._generate_content_config,
)
return response # Return response on success
except Exception as e:
print(e) # 打印异常详情
if attempt < max_retries - 1:
delay = base_delay_s * (2**attempt)
message = (
f"Generating content failed on attempt {attempt + 1}. "
f"Retrying in {delay} seconds...\n"
)
termcolor.cprint( # 使用彩色打印警告信息
message,
color="yellow",
)
time.sleep(delay)
else:
termcolor.cprint( # 使用彩色打印错误信息
f"Generating content failed after {max_retries} attempts.\n",
color="red",
)
raise
结构化日志输出
在函数调用过程中,项目使用rich.table.Table创建结构化日志,清晰展示推理过程和函数调用信息:
table = Table(expand=True)
table.add_column(
"Gemini Computer Use Reasoning", header_style="magenta", ratio=1
)
table.add_column("Function Call(s)", header_style="cyan", ratio=1)
table.add_row(reasoning, "\n".join(function_call_strs))
if self._verbose:
console.print(table) # 打印结构化表格
print()
这种方式使开发者能够直观地了解代理的决策过程和执行步骤,极大提高了调试效率。
安全确认日志
项目在agent.py中实现了安全确认机制,当需要用户确认时,会输出详细的安全提示信息:
termcolor.cprint(
"Safety service requires explicit confirmation!",
color="yellow",
attrs=["bold"],
)
print(safety["explanation"]) # 打印安全说明
decision = ""
while decision.lower() not in ("y", "n", "ye", "yes", "no"):
decision = input("Do you wish to proceed? [Yes]/[No]\n")
调试实践指南
基本日志查看
默认情况下,项目会输出基本日志信息。要查看详细日志,可在运行时确保verbose参数设置为True(默认值):
agent = BrowserAgent(
browser_computer=computer,
query=args.query,
model_name=args.model,
verbose=True # 启用详细日志
)
关键日志位置
以下是调试过程中需要重点关注的日志输出位置:
- 模型响应错误:agent.py - 打印模型调用异常详情
- 函数执行状态:agent.py - 展示函数调用表格
- 安全确认提示:agent.py - 安全操作确认信息
- 代理循环结束:agent.py - 打印最终推理结果
问题定位流程
当遇到问题时,建议按照以下流程进行定位:
- 检查agent.py输出的异常信息,确定是否为模型调用错误
- 查看函数调用表格,确认参数是否正确传递
- 检查环境状态变化,通过computer.py中的
current_state方法获取当前状态 - 若涉及浏览器操作,可查看playwright.py中的相关方法实现
高级日志优化建议
虽然当前日志系统已能满足基本需求,但仍有以下优化空间:
引入专业日志框架
建议使用Python标准库中的logging模块替代直接使用print,实现日志级别控制和输出重定向:
import logging
# 初始化日志配置
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("agent.log"),
logging.StreamHandler()
]
)
# 使用日志代替print
logging.error(f"Generating content failed: {e}")
增加日志上下文信息
在关键操作日志中增加更多上下文信息,如时间戳、代理ID等,便于分布式环境下的日志追踪:
# 改进示例
from datetime import datetime
def log_with_context(message, level="info"):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
context = f"[{timestamp}] [Agent ID: {self.agent_id}]"
full_message = f"{context} {message}"
if level == "info":
print(full_message)
elif level == "warning":
termcolor.cprint(full_message, color="yellow")
elif level == "error":
termcolor.cprint(full_message, color="red")
实现日志轮转
为避免日志文件过大,建议实现日志轮转机制,可使用logging.handlers.RotatingFileHandler或TimedRotatingFileHandler:
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler(
"agent.log",
maxBytes=1024*1024*5, # 5MB
backupCount=5 # 保留5个备份
)
总结
GitHub_Trending/co/computer-use-preview项目的日志系统通过简洁有效的设计,为开发者提供了必要的调试信息。本文详细介绍了日志系统的实现细节和使用方法,包括:
- 日志系统的架构和类型分布
- 关键日志实现代码解析
- 实际调试操作指南
- 日志系统的优化建议
通过合理利用现有日志和实施优化建议,开发者可以更高效地定位和解决问题,提升开发效率。完整的日志实现代码可参考agent.py文件,更多使用示例可查阅项目README.md。
掌握这些日志调试技巧,将帮助你在使用和开发该项目时事半功倍,快速解决遇到的各种问题。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0152- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112