camofox-browser 结构化日志与请求追踪:AI 浏览服务器的生产可观测性完整指南
【免费下载链接】camofox-browserStealth headless browser for AI agents — bypass Cloudflare, bot detection, and anti-scraping. Drop-in Puppeteer/Playwright replacement.项目地址: https://gitcode.com/GitHub_Trending/ca/camofox-browser
camofox-browser是一款面向 AI Agent 的隐身无头浏览器服务器(可绕过 Cloudflare 等反爬检测,是 Puppeteer/Playwright 的即插即用替代方案),内置结构化日志(JSON 单行输出 + 请求 ID)与请求追踪能力,帮助你在生产环境中快速定位"哪个 Agent、哪个请求、在哪一步卡住了"。本文将带你从零理解它的三层可观测性体系:JSON 结构化日志、8 位 reqId 请求追踪、按会话抓取的 Playwright Trace。
🧩 为什么 AI 浏览服务特别需要可观测性?
传统脚本"跑一次挂一次",出错了重跑即可;但 camofox-browser 是一个多租户、长驻内存的 REST 服务:
- 多个 Agent 用户(
userId)并发创建标签页、执行点击/导航/快照; - 一次"快照超时"可能源于页面反爬、浏览器进程崩溃或资源回收;
- 浏览器以懒启动 + 空闲关闭运行(空闲内存约 40MB),进程行为本身就会变化。
没有日志追踪,排查只能靠猜。camofox-browser 的解法是:每条日志都是 JSON、每个请求都有 ID、每个会话都可以留一份"录像带"。
📜 结构化日志:让日志聚合器一秒解析
所有日志输出均为JSON 单行格式(one object per line),由 server.js 中的log()函数统一写出。一个典型的请求生命周期会产出两行配对日志:
{"ts":"2026-02-11T23:45:01.234Z","level":"info","msg":"req","reqId":"a1b2c3d4","method":"POST","path":"/tabs","userId":"agent1"} {"ts":"2026-02-11T23:45:01.567Z","level":"info","msg":"res","reqId":"a1b2c3d4","status":200,"ms":333}这套设计有 4 个关键细节:
req/res配对 +ms耗时:请求进入与响应结束各打一条,通过同一个reqId关联,响应耗时直接给出,慢请求一眼可见;- 错误走 stderr、其余走 stdout:
error级别写入 stderr,其余写 stdout,符合容器/12 因子应用的日志采集惯例; /health健康检查不打日志:避免探活流量刷屏,降低噪音(见 server.js 的判断逻辑);- 业务事件也打 JSON 日志:
tab created、navigated、snapshot、clicked、tab recycled (limit reached)等关键动作都会记录,且全部携带reqId,例如:
log('info', 'tab created', { reqId: req.reqId, tabId, userId, sessionKey, url: page.url() });对接 ELK、Loki、Datadog 等任何日志聚合器时,无需自定义解析规则——按行JSON.parse即可。
🔍 请求追踪:一个 8 位 reqId 串起整条链路
请求追踪的入口是全局中间件(server.js):
- 每个 HTTP 请求到达时生成
reqId = crypto.randomUUID().slice(0, 8)(8 位短 ID,如a1b2c3d4); reqId挂载到req.reqId,随后所有业务日志、错误日志都从它取值,天然完成链路串联;- 同时启动 Prometheus 计时器,把该请求计入
requestDuration指标。
实际排查时的用法很简单:先从聚合器里按userId或错误关键字捞出reqId,再用它 grep 全部日志,就能还原该请求从进入 → 建页 → 导航 → 快照 → 返回的完整时间线:
# 按 reqId 还原一次请求的完整轨迹 docker logs camofox 2>&1 | grep a1b2c3d4🎬 会话级 Trace:把浏览器内部也"录下来"
日志回答"发生了什么",而Session Tracing回答"浏览器里到底发生了什么"。创建标签页时传入trace: true,即可为整个用户会话开启 Playwright Trace 抓取(截图 + DOM 快照 + 网络请求,全部打包为 zip):
curl -X POST http://localhost:9377/tabs \ -H 'Content-Type: application/json' \ -d '{"userId": "agent1", "sessionKey": "debug1", "url": "https://example.com", "trace": true}'Trace 文件通过三个 REST 端点管理(API 文档见 docs/api.html 与 openapi.json):
| 方法 | 端点 | 作用 |
|---|---|---|
GET | /sessions/:userId/traces | 列出该会话的全部 trace zip(新→旧) |
GET | /sessions/:userId/traces/:filename | 流式下载 trace zip |
DELETE | /sessions/:userId/traces/:filename | 删除指定 trace 文件 |
下载 zip 后可在官方的 Playwright Trace Viewer 中逐帧回放:每一步截图、DOM 状态、网络请求一目了然,专治"Agent 点击了但页面没反应"这类疑难杂症。
几个生产上值得注意的设计(实现见 lib/tracing.js):
- 隐私友好:trace 按
sha256(userId)前 16 位分目录存储,原始用户 ID 不落盘; - 自动清理:
sweepOldTraces会按 TTL 与单文件大小上限清理过期 trace,避免磁盘被占满; - 路径安全校验:
resolveTracePath拒绝..、绝对路径等越界文件名,防止目录穿越。
⚠️ 注意:trace只能在会话创建时开启;如果会话已存在但未开 trace,需先DELETE /sessions/:userId关闭会话后重新创建。
⚙️ 一键配置:两个环境变量搞定
Trace 相关的配置都在 lib/config.js,有合理默认值,开箱即用:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
CAMOFOX_TRACES_DIR | ~/.camofox/traces | trace 文件存储目录 |
CAMOFOX_TRACES_TTL_HOURS | 24 | 超过该小时数的 trace 自动删除 |
CAMOFOX_TRACES_DIR=/var/lib/camofox/traces \ CAMOFOX_TRACES_TTL_HOURS=12 \ npm start此外,服务还内置了 Prometheus 指标(requestsTotal、requestDuration、pageLoadDuration、activeTabsGauge、failuresTotal等,见 lib/metrics.js),可配合 Grafana 做监控告警;自动脱敏的崩溃遥测(lib/reporter.js)则用于识别常见故障站点,可用CAMOFOX_CRASH_REPORT_ENABLED=false关闭。
✅ 快速上手清单
- 先看
req/res配对日志:用ms字段找慢请求,reqId找同一请求的全部事件; - 慢/异常请求开 trace:出问题的那类操作,用
trace: true复现一次,下载 zip 回放定位; - 生产环境调 TTL:长调试保留 24h 默认即可,磁盘紧张可把
CAMOFOX_TRACES_TTL_HOURS调小; - 监控接入:把 stdout/stderr 交给日志聚合器,Prometheus 指标接告警,形成"日志 → 指标 → 现场回放"的完整闭环。
三层能力——结构化日志打地基、reqId 串链路、Session Trace 留现场——让 camofox-browser 这类长驻 AI 浏览服务在生产中不再"黑盒":出了问题,5 分钟内就能锁定请求、还原现场。
【免费下载链接】camofox-browserStealth headless browser for AI agents — bypass Cloudflare, bot detection, and anti-scraping. Drop-in Puppeteer/Playwright replacement.项目地址: https://gitcode.com/GitHub_Trending/ca/camofox-browser
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考