Hyperf 定时任务日志由主服务日志系统统一管理,需通过 LoggerFactory 获取指定 channel(如 'crontab')并配置对应文件 handler,确保日志写入 runtime/logs/crontab.log,避免使用 echo/var_dump 或依赖 Supervisor stdout。

Hyperf 定时任务本身不单独产生进程日志,它的执行日志统一由 Hyperf 主服务的日志系统接管。所谓“定时任务进程日志”,实际是任务执行过程中调用 $logger 写入的日志,其输出位置完全取决于 config/autoload/logger.php 中对应 channel 的 handler 配置,而非进程启动参数或 crontab 组件自身设置。
确认日志写入目标通道
Hyperf 定时任务默认使用 default 日志通道,但推荐为任务单独配置 channel(如 'crontab'),避免与业务日志混杂:
- 在
config/autoload/logger.php中新增 channel,例如:
return [
'crontab' => [
'handler' => [
'class' => \Monolog\Handler\StreamHandler::class,
'constructor' => [
'stream' => BASE_PATH . '/runtime/logs/crontab.log',
'level' => \Monolog\Logger::INFO,
],
],
],
];
- 确保
runtime/logs/目录存在且 Web/PHP 进程有写权限(如chown -R www-data:www-data runtime/logs)
任务代码中正确获取并使用该 channel
在定时任务类中,通过 LoggerFactory 显式获取 crontab channel 实例:
- 注解方式任务:
#[Crontab(name: 'SyncData', rule: '0 * * * *')]
class SyncDataTask
{
public function __construct(
protected LoggerFactory $loggerFactory
) {}
public function execute(): void
{
$logger = $this->loggerFactory->get('crontab', 'crontab'); // 第二个参数必须匹配 config 中的 channel 键名
$logger->info('sync started', ['time' => date('Y-m-d H:i:s')]);
}
}
- 配置文件方式任务:同样在
callback方法内调用$loggerFactory->get('crontab', 'crontab')
补充:验证日志是否生效
仅靠写日志还不够,需确认输出路径和内容可查:
- 检查日志文件是否生成:
ls -l runtime/logs/crontab.log - 实时追踪写入:
tail -f runtime/logs/crontab.log - 若文件为空,先确认任务是否真正触发(查看主日志
hyperf.log是否有Crontab manager started和执行时间戳) - 避免在
execute()中使用echo或var_dump—— Supervisor 或 Swoole 环境下这些不会落盘,只有 logger 写入才可靠
不建议依赖 Supervisor 捕获定时任务 stdout
Supervisor 的 stdout_logfile 只能捕获进程启动阶段的输出(如 autoload 报错),而 Hyperf 定时任务运行在主 Worker 进程内,其 echo 类输出会被 Swoole 丢弃或重定向到空设备。因此:
- 不要指望
supervisorctl tail my-hyperf stdout看到任务日志 - 所有可追溯、可归档的任务日志,必须走
LoggerFactory->get(...)+ 文件 handler 路径配置 - 如需集中采集,可将
crontab.log接入 filebeat / fluentd 等日志收集器


















