要让Swoole服务日志可追溯且高性能,须禁用stderr输出、避免多进程混写、屏蔽PHP error_log,并在start()前通过set()配置log_file(绝对路径+权限)和log_level(WARNING/ERROR);Worker日志需用真实PID隔离;高频订单日志须用Channel协程异步写入;冗余心跳日志可通过/dev/null或空onClose回调屏蔽。

要让Swoole服务的日志既可追溯又不拖慢性能,必须避开默认stderr输出、避免多进程日志混写、禁用PHP原生error_log干扰,并在Server实例化前完成关键参数设定。
基础日志路径与级别设置
第一步:在new Swoole\Http\Server或Swoole\Server之后、start()之前调用set()方法配置log_file和log_level。
第二步:log_file必须指定绝对路径,且目录需提前创建并赋予worker进程写权限,例如/var/log/swoole/app.log;若路径不存在或权限不足,日志将静默丢失,【不会报错也不会提示】。
第三步:log_level设为SWOOLE_LOG_WARNING或SWOOLE_LOG_ERROR,可过滤掉大量INFO/NOTICE级日志;注意SWOOLE_LOG_DEBUG和SWOOLE_LOG_TRACE仅在编译时启用--enable-swoole-debug才有效,线上环境切勿依赖。
Worker进程日志隔离方案
默认所有Worker共用一个log_file,高并发下极易因文件锁竞争导致日志截断或覆盖关键错误。
方法一:使用getmypid()动态生成日志路径,例如'log_file' => '/var/log/swoole/worker_'.getmypid().'.log'。
方法二:仅在onWorkerStart回调中获取真实PID——PHP-FPM环境下getmypid()返回的是master进程PID,直接用会全部写进同一个文件。
【SWOOLE_BASE模式不适用此法】,因其无独立Worker进程概念;SWOOLE_PROCESS模式下可安全使用。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
订单类高频日志的非阻塞写入
订单处理逻辑中禁止出现fopen、file_put_contents等同步I/O操作,否则协程挂起,吞吐量归零。
创建容量为1024的Channel:$loggerChannel = new Swoole\Coroutine\Channel(1024);
启动后台协程消费日志:go(function () use ($loggerChannel) { $fp = fopen('/data/logs/order.log', 'a'); stream_set_write_buffer($fp, 0); while (true) { $msg = $loggerChannel->pop(); fwrite($fp, date('Y-m-d H:i:s') . " [ORDER] {$msg}\n"); fflush($fp); } });
主逻辑只需投递:$loggerChannel->push("order_no=ORD123456 status=paid");,这一步完全不阻塞。
隐藏心跳关闭等冗余日志
像recv: connection#X closed这类心跳检测日志无法通过log_level屏蔽,因为它们属于底层连接事件,级别固定为NOTICE。
方法一:将log_file指向/dev/null(Linux)或NUL(Windows),彻底丢弃所有Swoole日志。
方法二:重写onClose回调并留空:$server->on('close', function ($server, $fd) {});,可拦截该事件对应的日志生成链路。

















