在ThinkPHP6定时任务execute()中调用Log门面记录日志,通过自定义'timing'通道隔离文件,按时间/模式/参数等上下文结构化输出info/error/debug日志,确保落盘可追溯。

给 ThinkPHP6 定时任务添加执行日志,核心是**在命令类的 execute() 方法中写入日志记录**,并确保日志能落盘、可追溯、带上下文。不依赖外部脚本或 crontab 重定向,而是由框架原生支持,更可控、更规范。
在 execute() 中调用 Log 门面记录关键节点
ThinkPHP6 的 think\facade\Log 可直接在命令行环境中使用,无需额外初始化。推荐在任务开始、关键步骤、成功/失败处分别记录:
- 用
Log::info()记录正常流程(如“任务启动”“清理缓存完成”) - 用
Log::error()记录异常(如数据库操作失败、网络请求超时) - 用
Log::debug()记录调试信息(如处理条数、耗时、参数值),仅在调试阶段开启 - 避免只写
$output->writeln()——它只输出到终端,不保存为日志文件
按任务名称隔离日志文件(提升可维护性)
默认所有日志混在 runtime/log/ 下,排查困难。可通过自定义日志通道,让每个定时任务写入独立文件:
- 在
config/log.php中新增一个通道,例如:
'timing' => [
'type' => 'File',
'path' => runtime_path('log/timing/'),
'level' => ['info', 'error', 'notice']
], - 在命令类的
execute()中指定通道:Log::channel('timing')->info('cron:clean-cache started'); - 目录
runtime/log/timing/会自动创建,日志按日期分文件(如20261029.log)
补充执行上下文:时间、模式、参数
光有“任务完成”不够,需知道“谁、何时、以什么方式、处理了什么”。建议在日志中显式带上:
- 当前时间戳:
date('Y-m-d H:i:s')(Log 默认已带,但可再强化) - 执行模式(如 test/force/normal):
$input->getArgument('mode') ?? 'normal' - 关键参数值(如批次大小、ID 范围):
Log::info("处理用户范围: {$start} - {$end}", [...]) - 运行环境标识:
App::env('APP_ENV'),区分开发/生产日志行为
配合 crontab 时注意日志权限与路径
如果通过 Linux crontab 调用 php think xxx,需确保:
- crontab 执行用户对
runtime/目录有写权限(常见问题:日志写入失败却无报错) - 不要在 shell 脚本里用
>>重定向覆盖 Log 功能(如php think xxx >> log.txt),会丢失结构化日志和级别信息 - 若必须保留 shell 日志,可用追加方式,并与框架日志互补:
2>&1 | tee -a /var/log/think-cron.log
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











