ThinkPHP 6 定时任务日志需显式配置,必须开启 realtime_write=true 并为 CLI 单独定义日志通道;crontab 层需重定向 stdout/stderr 到绝对路径文件;日志链分三层(crontab→shell→PHP),需逐层排查;建议结构化记录任务标识、耗时、错误上下文及敏感操作标记。

ThinkPHP 6 的定时任务本身不产生独立日志,日志是否生成、写入哪里、能否查到,完全取决于你如何编写命令类和配置 crontab。关键不是“TP6 怎么记日志”,而是“你怎么让日志落盘且不丢”。
定时任务日志必须显式配置,不能依赖默认行为
CLI 环境下,Log::info() 默认走的是 file 通道,但若未在 config/log.php 中明确设置 realtime_write => true,日志可能缓存在内存中,进程退出即丢失。尤其在短时执行的定时命令里,静默失败很常见。
- 务必在日志通道配置中开启实时写入:
'realtime_write' => true - 避免混用通道:不要在命令里写
Log::info()却没指定 channel,它可能被 level 过滤或写进错误目录 - 推荐为定时任务单独建一个通道,比如
cli,并在config/log.php中定义:"cli" => [ "type" => "File", "path" => runtime_path() . "log/cli/", "level" => ["info", "warning", "error"], "realtime_write" => true, "apart_level" => ["error", "warning"] ] - 在命令 execute 方法中统一调用:
Log::channel('cli')->info('订单同步开始');
crontab 调用层的日志重定向是第一道防线
即使 PHP 层日志写成功了,如果 crontab 执行出错(如路径不对、PHP 找不到、权限拒绝),你根本看不到任何输出——因为 crontab 默认丢弃 stdout/stderr。
- shell 脚本中必须重定向:
>> /var/log/myapp/cron-backup.log 2>&1 - 日志文件路径需绝对化,且确保目录可写(crontab 以 www 或 nobody 用户运行,非当前登录用户)
- 建议按日期分文件,避免单个日志无限增长:
>> /var/log/myapp/cron-backup_$(date +\%Y\%m\%d).log 2>&1 - 首次调试时,先用
* * * * *每分钟跑一次,确认 shell 脚本能执行、PHP 能启动、think 命令能识别、日志有内容再调整周期
分析日志要区分层级,定位问题才快
一份完整的定时任务日志链包含三层:crontab 层 → shell 层 → PHP/TP6 层。分析时要逐层排查:
立即学习“PHP免费学习笔记(深入)”;
-
crontab 层无日志:检查
sudo tail -f /var/log/cron,看是否有 “(root) CMD (…)" 记录,没有说明 crontab 未生效或语法错误 -
shell 日志为空或 Permission denied:检查脚本权限(
chmod +x backup.sh)、PHP 路径(which php)、项目目录是否可进入(cd /path && pwd) -
PHP 日志有内容但业务没执行:检查命令类中是否漏掉
app('db')->connect()导致数据库报错静默;或模型调用未加 try-catch,异常终止后无 error 日志 -
日志里出现 Class not found:90% 是没在 shell 中正确切换工作目录(
cd /var/www/myapp),导致自动加载失败
结构化日志便于后续分析与告警
纯文本日志难检索。建议在 CLI 日志中主动打结构化字段,方便 grep 或导入 ELK:
- 每条日志开头加任务标识和时间戳:
[backup:data][2026-08-06 14:02:01] 开始备份用户表... - 关键操作记录耗时:
$start = microtime(true); ... $cost = round(microtime(true) - $start, 3); Log::channel('cli')->info("备份完成,耗时 {$cost}s"); - 失败时记录完整上下文:
Log::channel('cli')->error("备份中断,表 user,错误:" . $e->getMessage()); - 敏感操作(如删除、支付回调)额外标记:
Log::channel('cli')->warning("[ALERT] 支付超时订单批量关闭,影响 {$count} 条");



















