frankenphp 默认日志不输出到 stdout/stderr,需设 caddy_log_output=stdout(0.19+)使 caddy 日志转 json 到 stdout,并用 error_log($json, 4) 让 php 应用写结构化 json 到 stderr,配合 filebeat/fluent bit 正确解析。

FrankenPHP 的日志输出默认不走 stdout/stderr
很多人以为启动 FrankenPHP 后 var_dump() 或 error_log() 会直接进容器 stdout,结果日志采集工具(比如 Filebeat、Fluent Bit)完全收不到。根本原因是 FrankenPHP 默认把 PHP 错误日志写到文件(如 /var/log/php/error.log),而访问日志由 Caddy(内置 HTTP 服务器)按自己的格式写入文件,两者都不经过标准流。
强制让 Caddy 访问日志输出到 stdout
Caddy 的 log 指令支持 output stdout,但 FrankenPHP 的内置 Caddy 配置是封装好的,不能直接改 Caddyfile。得通过环境变量覆盖:
- 启动容器时加
-e CADDY_LOG_OUTPUT=stdout - 确保你用的是 FrankenPHP 0.19+(旧版该变量无效)
- 这样 Caddy 会把 access log 和 error log 都打到 stdout,每行是 JSON 格式(含
level、msg、request_id等字段)
注意:它不会自动把 PHP 应用里的 error_log() 或 Monolog 输出转成 JSON——那部分还得你自己处理。
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
PHP 应用内输出结构化 JSON 到 stderr
想让应用层日志(比如调试信息、业务事件)也被采集,就得让 PHP 主动往 stderr 写合法 JSON 行(每行一个 JSON 对象,不换行、不缩进):
- 避免用
echo json_encode(...)直接输出,容易漏换行或编码错误 - 推荐用
error_log(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 4)(4表示写到 stderr) - 字段建议包含
level("info"/"error")、message、timestamp(用date('c'))、context(数组) - 别在 JSON 里塞二进制数据或未过滤的用户输入,否则可能破坏日志行解析
Filebeat / Fluent Bit 配置要匹配 JSON 行格式
即使日志进了 stdout,如果采集端没设对解析规则,还是拿不到结构字段:
- Filebeat:在
filebeat.inputs下加json.keys_under_root: true和json.add_error_key: true,并确认paths指向容器 stdout(K8s 里通常是/var/log/containers/*.log) - Fluent Bit:用
Parser插件配Format json,别用regex解析 JSON 行——它原生支持逐行 JSON - 验证方法:先
docker logs <container></container>看输出是否每行都是合法 JSON(可用jq -R 'fromjson' 测试)
最常被忽略的是时间字段缺失或格式不统一——Caddy 日志用 time 字段(ISO8601),而 PHP 自己打的日志如果用 microtime(true) 就得额外转换,否则采集端无法对齐时间线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










