ece2 / hyperf-ext-sls
Aliyun SLS Monolog handler for Hyperf 3
v2.0.0
2026-07-28 07:14 UTC
Requires
- php: >=8.1
- ext-json: *
- ext-zlib: *
- alibabacloud/aliyun-log-php-sdk: ^0.7.0
- guzzlehttp/guzzle: ^7.4
- hyperf/coroutine: ^3.0
- hyperf/guzzle: ^3.0
- hyperf/logger: ^3.0
- hyperf/pool: ^3.0
- hyperf/support: ^3.0
- monolog/monolog: ^3.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/phpstan: ^1.0
README
面向 Hyperf 3、PHP 8.1+ 和 Monolog 3 的阿里云日志服务 Handler。组件使用官方日志服务 SDK 的 PutLogs 接口,以 PB 格式、AccessKey 签名和压缩方式写入 Logstore,不需要开启 Web Tracking。
安装
composer require ece2/hyperf-ext-sls:^2.0 php bin/hyperf.php vendor:publish ece2/hyperf-ext-sls
发布命令只会创建 config/autoload/sls.php,不会覆盖应用现有的 logger.php。
配置日志 Handler
将以下 Handler 合并到 config/autoload/logger.php 对应日志组的 handlers 中:
use Ece2\HyperfExtSls\SlsHandler; use Monolog\Level; return [ 'default' => [ 'handlers' => [ [ 'class' => SlsHandler::class, 'constructor' => [ 'config' => config('sls'), 'level' => Level::Info, ], ], ], ], ];
至少需要配置以下环境变量:
SLS_ACCESS_KEY_ID= SLS_ACCESS_KEY_SECRET= SLS_ENDPOINT=https://cn-shanghai.log.aliyuncs.com SLS_PROJECT= SLS_LOG_STORE_NAME= SLS_TOPIC=api_log SLS_SOURCE=hyperf
使用 STS 临时凭据时可额外配置 SLS_SECURITY_TOKEN。生产环境应使用仅具有目标 Project、Logstore 写权限的 RAM 身份,不要使用主账号长期 AccessKey。
批量与连接池
- 默认累计 100 条或等待 1 秒后调用一次
PutLogs。 - 达到批量阈值后在当前协程发送,不再为每条日志创建独立协程。
- HTTP 传输使用当前客户端实例自己的 Hyperf
PoolHandler,不会修改 Tea SDK 的进程级全局配置。 - 连接池满时由当前日志调用自然等待,避免无限堆积发送协程。
- 非协程环境会立即发送;Handler
reset或close时会刷新未满批次。 - 发送失败的批次写入
SLS_FALLBACK_PATH,默认是runtime/logs/hyperf.log。
可按业务量调整:
SLS_BATCH_SIZE=100 SLS_FLUSH_INTERVAL=1 SLS_MAX_GUZZLE_CONNECTIONS=50 SLS_CONNECT_TIMEOUT=3 SLS_TIMEOUT=5 SLS_MAX_ATTEMPTS=3 SLS_RETRY_DELAY=0.1 SLS_MAX_FIELD_LENGTH=262144 SLS_MAX_BATCH_BYTES=2097152
若需要把同一生产者的数据固定路由到一个 Shard,可配置 SLS_SHARD_KEY;未配置时使用 SLS 负载均衡写入模式。并发请求仍可能按不同顺序到达,如业务要求严格顺序,还需在调用侧串行写入。
从 1.x 升级
2.x 是破坏性版本:
- 只支持 Hyperf 3、Monolog 3 和 PHP 8.1+。
- 从匿名
PutWebtracking切换为鉴权PutLogs,请关闭 Logstore 的 Web Tracking 开关。 - 不再发布并覆盖
config/autoload/logger.php,需手动合并上方 Handler 配置。 context和 Monolog Processor 写入的extra都会保存;数组和对象会转为 JSON 字符串。- 旧版如果曾在
vendor内手动修改write()方法签名,升级后应删除该补丁并重新安装依赖。