Workerman 日志默认输出到终端(标准输出/标准错误),守护进程模式下需重定向或设置 Worker::$logFile 指定绝对路径文件,PHP 错误日志则由 php.ini 的 error_log 配置决定。

Workerman 日志默认输出到哪里?
Workerman 默认不写文件日志,所有 echo、var_dump、Worker::log() 都直接打印到终端(标准输出/标准错误),也就是你启动时看到的控制台内容。一旦关闭终端或用 nohup 启动,这些日志就丢了——不是没记录,是根本没落盘。
所以别急着改配置,先确认:你是不是在守护进程模式下运行却还在找终端输出?
-
php start.php start -d后,日志默认消失,除非你重定向了 stdout/stderr -
Worker::log('xxx')本质调的是error_log(),走 PHP 的错误日志通道,受error_log配置影响,不一定进文件 - Web 服务器(如 Nginx)访问日志和 Workerman 应用日志是两码事,别混在一起查
怎么让 Worker::log() 写进指定 log 文件?
最直接的办法:在代码里改 Worker::$logFile。它必须是绝对路径,且 PHP 进程有写权限。Workerman 会在每次 Worker::log() 时追加写入,不轮转、不压缩。
示例(放在 start.php 最开头,Worker 启动前):
use Workerman\Worker; Worker::$logFile = '/var/log/workerman/app.log';
- 路径必须存在,目录得提前
mkdir -p /var/log/workerman并chown给运行用户(比如 www-data 或 nobody) - 别用相对路径,
./logs/app.log在守护进程下大概率写失败,因为工作目录可能已变 - 这个设置只影响
Worker::log(),不影响echo或异常未捕获时的报错
想记录 PHP 错误(Warning/Fatal Error)进文件怎么办?
Workerman 运行中抛出的未捕获异常、PHP 警告、致命错误,默认走 PHP 的 error_log 机制。要让它进文件,得改 PHP 配置,而不是 Workerman 配置。
- 修改 php.ini 中的
error_log = /var/log/php_errors.log(确保路径可写) - 同时设
log_errors = On,否则什么都不会记 - 如果用不同 PHP SAPI(如 CLI 和 FPM 分开),注意 CLI 的 php.ini 可能和 Web 的不是同一个,查
php --ini - Workerman 自身的
onError回调可以补一手,但只是辅助:$worker->onError = function($connection, $code, $msg, $file, $line) { Worker::log("PHP Error {$code}: {$msg} in {$file}:{$line}"); };
日志太多撑爆磁盘?没有自动切割怎么办?
Workerman 原生不带日志轮转。Worker::$logFile 是纯追加,跑几个月就是几个 GB 的单文件,tail -f 会越来越卡,grep 也慢。
- 别自己写定时脚本清空(
> app.log),会中断正在写入的日志句柄,导致丢日志 - 推荐用系统级工具:logrotate。配一个
/etc/logrotate.d/workerman:/var/log/workerman/*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 www-data www-data sharedscripts } - 如果必须代码内控制,可用
file_put_contents($file, $msg, FILE_APPEND | LOCK_EX)替代Worker::log(),再自己判断文件大小做分割——但没必要,logrotate 更稳
真正容易被忽略的是权限和路径一致性:CLI 模式下 PHP 用户(可能是 root 或普通用户)、logrotate 运行用户、Workerman 实际 worker 进程用户,三者对日志目录的读写权限必须对齐,否则看起来配好了,其实一行都没写进去。










