FrankenPHP 无内置 JSON 推送函数,须用 error_log(json_encode($data), 4) 输出单行 JSON 到 stderr;Caddy 需 ≥0.19 版并设 CADDY_LOG_OUTPUT=stdout 才输出 JSON 访问日志;采集端需配置为单行 JSON 解析。

FrankenPHP 本身不提供“推送 JSON 数据”的内置函数
你搜到的 frankenphp_log 或类似名字,不是 FrankenPHP 官方 API。它没有封装好的「推送 JSON 到某处」的函数——所有结构化日志输出,都得靠 PHP 原生机制主动控制流向和格式。
想让日志变成 JSON 并进采集管道,必须走 error_log() + json_encode()
FrankenPHP 不拦截 error_log(),但它的容器运行时(Docker / Kubernetes)会捕获 stdout/stderr 流。这是唯一可控、可预测的 JSON 日志出口:
- 用
error_log(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 4)写到 stderr(推荐),或0写到 stdout -
$data必须是关联数组,含timestamp(建议(new DateTime())->format('c'))、level、message、context - 别在
context里塞$_POST全量、资源句柄或二进制数据,json_encode()会静默失败或截断 - 每行必须严格单行、合法 JSON:不能缩进、不能换行、不能嵌套 JSON 字符串
Caddy 层的访问日志也要 JSON,得靠环境变量开关
FrankenPHP 内置 Caddy,默认把 access log 写文件,不走 stdout。要让它也吐 JSON 到标准流,必须满足两个条件:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 使用 FrankenPHP ≥ 0.19 版本
- 启动时加
-e CADDY_LOG_OUTPUT=stdout(注意不是CADDY_LOG_FORMAT=json) - 这样 Caddy 会输出每行一个 JSON 对象,字段含
time、level、msg、request_id等 - 但它**不会**自动把 PHP 应用里的
error_log()转成 JSON——那部分仍需你自己调json_encode()
Logstash / Fluent Bit 必须按单行 JSON 解析,否则白搭
即使 PHP 和 Caddy 都输出了合法 JSON 行,采集端配置错,字段还是提取不出来:
立即学习“PHP免费学习笔记(深入)”;
- Filebeat:确认
json.keys_under_root: true+json.add_error_key: true,且输入paths指向容器 stdout(K8s 下通常是/var/log/containers/*.log) - Fluent Bit:用
Parser插件配Format json,别用 regex 解析 JSON 行 - 验证方法:
docker logs <container> | jq -R 'fromjson' 2>/dev/null | head -5—— 能过就是每行合法 JSON - 最常被忽略的是时间字段不统一:
Caddy用time字段(ISO8601),PHP 自己打的日志如果用microtime(true)就得手动转成date('c'),否则字段对不上


















