Workerman 4 默认不对接 syslog,日志走 PHP error_log() 或标准输出;需在 start.php 中用 openlog()/syslog() 主动发送结构化日志,并配置 rsyslog 独立落盘或转发。

Workerman 4 默认不对接 syslog,所有日志(Worker::log()、echo、未捕获异常等)都走 PHP 的 error_log() 或标准输出,而 PHP 的 error_log() 默认由 php.ini 中的 error_log 配置决定——通常指向文件或 syslog,但这是**PHP 全局错误日志通道**,不是 Workerman 自身运行日志的可控出口。
为什么不能直接靠 php.ini 的 error_log = syslog?
因为:
- Workerman 的
Worker::log()在守护进程模式(-d)下默认被重定向到/dev/null,除非你显式设置了Worker::$logFile; - 即使
php.ini设了error_log = syslog,它只影响trigger_error()、error_log()函数调用及 PHP 解析错误,不自动捕获 Workerman 进程启动、连接建立、定时器触发等框架级事件; - syslog 接收的是无结构纯文本,缺乏
facility和severity的合理标记,不利于后续按服务分类采集或安全审计。
正确做法:在 start.php 中主动写入 syslog
Workerman 4 支持通过 openlog() + syslog() 手动发送结构化消息。推荐在 start.php 开头初始化 syslog 句柄,并封装一个安全日志函数:
在 start.php 顶部添加:
// 初始化 syslog,指定 facility 为 local4(可自定义),标识为 'workerman'
openlog('workerman', LOG_PID | LOG_CONS, LOG_LOCAL4);
<p>// 封装日志函数,支持 level 映射
function wlog($message, $level = LOG_INFO) {
$timestamp = date('c');
$pid = getmypid();
$msg = sprintf('[%s][PID:%d] %s', $timestamp, $pid, $message);
syslog($level, $msg);
}</p><p>// 启动前记录
wlog('Workerman starting...', LOG_NOTICE);
然后在 Worker 回调中使用,例如:
$worker->onWorkerStart = function($worker) {
wlog("Worker #{$worker->id} started", LOG_INFO);
};
<p>$worker->onConnect = function($connection) {
wlog("New connection from {$connection->getRemoteIp()}", LOG_INFO);
};
rsyslog 配置:把 workerman 日志单独落盘
编辑 /etc/rsyslog.d/20-workerman.conf:
# 捕获 facility local4 的所有日志,写入独立文件 local4.* /var/log/workerman/syslog.log <h1>可选:转发到远程 SIEM(如启用 UDP 转发)</h1><h1><em>.</em> @192.168.10.5:514</h1><p>
重启 rsyslog:
sudo systemctl restart rsyslog
确保目录存在且权限正确:
sudo mkdir -p /var/log/workerman sudo chown syslog:adm /var/log/workerman
补充:守护进程模式下必须关闭 stdout/stderr 重定向干扰
若你已在 start.php 中设置了:
Worker::$stdoutFile = '/var/log/workerman/stdout.log'; Worker::$stderrFile = '/var/log/workerman/stderr.log';
请确认这两项不与 syslog 写入冲突——它们用于捕获 PHP 标准输出和错误,而 syslog() 是独立通道。两者可共存,但建议:
-
stdoutFile/stderrFile保留用于调试(如启动报错、语法错误); -
syslog()用于业务运行时结构化日志(连接、广播、心跳等),便于集中采集和告警。
这样既满足 Linux 系统日志规范,又保持 Workerman 运行可观测性。


















