Files
cursor/plans/slot_agent-06741b7f.plan.md
ray zhou 2dd9f17da9 ok
2026-06-29 14:51:55 +08:00

7.2 KiB
Raw Permalink Blame History


todos:

  • id: "migrate-log-calls" content: "13 个文件LoggerService::info/error/warning → support\Log统一 context 为 array" status: pending
  • id: "migrate-trace-timing" content: "InnerCurlService / OutputService / EventBus改用 Context + TraceIdMiddleware::initContext" status: pending
  • id: "delete-logger-service" content: "删除 LoggerService.php更新 README §8.1" status: pending
  • id: "fix-handler-syntax" content: "修复 app/exception/Handler.php 末尾多余花括号" status: pending
  • id: "verify" content: "grep 无残留引用 + 跑 report.sh + CLI/HTTP/MQ 冒烟" status: pending isProject: false

slot_agent 废弃 LoggerService 完整迁移

结论

可以不再使用 LoggerService 写日志,但不能「只配好 config/log.php 就删类」——当前仍有 13 个文件、约 56 处 LoggerService:: 调用,且 3 处依赖其 trace/timing 工具方法。

你已有的新栈已覆盖旧能力:

能力 LoggerService 新配置
落盘 直接 SeasLog::* config/log.phpSeasLogHandler
traceId $_SERVER['TRACE_ID'] 手动拼进 message TraceIdMiddlewareContext::get('trace_id') + SeasLog::setRequestID
调用位置 debug_backtrace 手动 JSON IntrospectionProcessor(已排除 support\Log
请求耗时 $_SERVER['REQUEST_TIME_FLOAT']HTTP 几乎未初始化) Context::get('request_time')Middleware 已写入)

当前项目处于 双轨并存会导致同一次请求里日志格式、trace 来源不一致:

flowchart LR
  subgraph old [旧路径]
    LS[LoggerService] --> SeasLogDirect[SeasLog 直连]
    LS --> ServerTrace["$_SERVER TRACE_ID"]
  end
  subgraph new [新路径]
    LogFacade["support\\Log"] --> Monolog[Monolog]
    Monolog --> Handler[SeasLogHandler]
    Handler --> SeasLogCtx[SeasLog + Context trace_id]
    TraceMW[TraceIdMiddleware] --> Context[Context]
  end

迁移范围(按职责)

1. 写日志:统一改为 support\Log

涉及文件(全部在 slot_agent/app/ 下):

替换约定(与现有 AuthMiddleware 对齐):

// 旧
LoggerService::info(__METHOD__, $payload);

// 新 — context 必须是 array标量包一层
Log::info(__METHOD__, is_array($payload) ? $payload : ['msg' => $payload]);
// 旧 — Throwable
LoggerService::error(__METHOD__, $exception);

// 新 — 与 AuthMiddleware 一致
Log::error($exception);
// 或需要业务前缀时:
Log::error(__METHOD__, ['msg' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine()]);

CLI/MQ 消费若需独立 trace在 handler 入口调用一次:

use Slot\Foundation\Middleware\TraceIdMiddleware;

TraceIdMiddleware::initContext(); // 替代 LoggerService::initGenerateTraceId()

EventBus::deal() 第 59 行即此处。

2. trace / timing改用 Context不再读 $_SERVER

文件 旧 API 新 API
InnerCurlService LoggerService::getTraceId() Context::get('trace_id');空则 TraceIdMiddleware::initContext() 后再取
OutputService LoggerService::getRequestTime() Context::get('request_time', microtime(true))timing = microtime(true) - $start
EventBus initGenerateTraceId() TraceIdMiddleware::initContext()

TRACE_CHILD_ID / setChildId / initRequestTime 在 slot_agent 无任何调用,删除 LoggerService 时一并移除即可。

3. 删除与文档

4. 顺带修复(改 Handler 时)

app/exception/Handler.php 文件末尾有多余 {\n\n},迁移时一并去掉,避免语法问题。


不需要改动的部分


验证

  1. 跑 completion reportSLOT_ROOT=/Users/ray/Documents/project/www/slot/slot_agent ~/.cursor/skills/slot-backend-completion-report/scripts/report.sh
  2. 手动冒烟:
    • HTTPAuthMiddleware 已有 Log::info,确认 runtime/logs/webman/ 含 trace + 调用栈
    • CLIphp webman testTest.php 已有 Log 示例)
    • MQevent:bus 消费一条消息,确认 CLI 日志有独立 trace_id
  3. 确认全仓库 slot_agent 内无 LoggerService 引用

风险与注意

  • 日志格式会变:旧格式为 trace_id|Class::method | json {"file":...} 单行;新格式由 SeasLogLineFormatter + IntrospectionProcessor 决定。若 ELK/告警规则按旧格式解析,需同步调整。
  • 跨服务 trace 传递InnerCurlService 请求头 traceId 应改为传 Context::get('trace_id'),与 TraceIdMiddleware 一致(不再用 trace_id:xxx 前缀的 uniqid 格式)。
  • OutputService timing 行为会修正HTTP 请求将正确使用 Middleware 写入的 request_time,不再依赖几乎未初始化的 REQUEST_TIME_FLOAT