frankenphp日志默认不写文件,需通过systemd重定向stdout/stderr到指定路径,或在frankenphp.yaml中显式启用access log;php的error_log()等调用无效,须用systemd、syslog或手动fopen写入。

FrankenPHP 的日志输出默认不写文件,得靠 SAPI 层配置
FrankenPHP 本身不提供类似 error_log = /var/log/php.log 这样的 PHP INI 级日志文件路径控制——它的日志走的是底层 SAPI(Server API)的 stderr/stdout 流。也就是说,你直接改 php.ini 里的 error_log 通常无效,除非你用的是 CLI 模式启动,但那不是 Web 场景。
用 systemd 重定向 stdout/stderr 是最稳的方案
如果你用 systemd 管理 FrankenPHP(比如官方推荐的 frankenphp.service),日志落地就靠它。systemd 默认把服务的 stdout/stderr 收集进 journal,但你要写入指定文件,就得加两行重定向:
[Service] StandardOutput=append:/var/log/frankenphp-access.log StandardError=append:/var/log/frankenphp-error.log
注意点:
-
append:前缀必须写,否则 systemd 会拒绝启动(报Invalid argument) - 确保运行 FrankenPHP 的用户(如
www-data)对目标目录有写权限,否则日志静默丢失 - PHP 的
error_log()、trigger_error()和未捕获异常都会落到StandardError对应的文件 - HTTP 请求访问日志(access log)需额外在
frankenphp.yaml中开启,否则StandardOutput只有少量启动/健康检查信息
想让 PHP 的 error_log() 写进文件?得绕过 FrankenPHP 的 SAPI 限制
FrankenPHP 的 SAPI 实现会忽略 error_log INI 设置,但你可以用 syslog() + rsyslog 转发,或更直接地:在代码里强制 fopen + fwrite:
// 替代 error_log() 的落地写法
$fh = @fopen('/var/log/myapp-php-errors.log', 'a');
if ($fh) {
fwrite($fh, date('c') . ' ' . $message . "\n");
fclose($fh);
}
不过这属于“补丁式”做法,缺点明显:
- 并发写入可能丢日志(没加锁)
- PHP 错误级别(E_WARNING/E_NOTICE)不会自动触发,得手动
set_error_handler()拦截 - 比 systemd 重定向多一层 I/O 开销,且绕过了日志轮转机制
access log 必须显式启用,且格式固定
FrankenPHP 不像 Nginx 那样默认记 access log。要在 frankenphp.yaml 里打开:
server:
logs:
access:
file: /var/log/frankenphp-access.log
format: "common"
目前只支持 common 和 json 两种 format,不能自定义字段。另外:
-
file路径必须是绝对路径 - 该日志和 systemd 的
StandardOutput是两套系统,别同时开,否则重复写 - PHP-FPM 的
slowlog功能在 FrankenPHP 里不存在,慢请求只能靠应用层埋点或opcache_get_status()查
真正容易被忽略的是权限链:FrankenPHP 进程用户 → 日志目录属主 → systemd 的 User= 配置三者必须一致,否则连 open() 都失败,还查不到报错——因为错误日志自己就写不进去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











