ThinkPHP6 CLI命令日志需手动初始化并调用save():使用$this->app->log()获取实例,配置file驱动、确保目录可写,避免静态Log::调用,推荐为命令单独配置cli通道。

在 ThinkPHP6.0 的命令行模式(如使用 php think xxx 执行自定义命令)下,默认日志行为与 HTTP 请求不同:它不会自动触发日志写入,除非显式调用或配置了合适的日志驱动和时机。要让命令行任务也能可靠记录日志,关键在于确保日志实例已初始化、日志通道配置正确,并在合适位置调用写入方法。
确认日志配置支持 CLI 环境
ThinkPHP6 默认的日志配置位于 config/log.php。CLI 模式下需注意:
- 日志驱动(
default)建议设为file(最稳定),避免依赖请求上下文的驱动(如trace) - 确保
path配置的目录存在且可写,例如:runtime/log/ - CLI 下不走 HTTP 生命周期,所以
close回调(如自动写入)可能不会触发,需手动刷新
在命令类中主动获取并写入日志
在自定义命令类(继承 think\ConsoleCommand)中,推荐使用容器获取日志实例,而非静态调用 Log::(因 CLI 下部分静态代理可能未完全初始化):
- 使用
$this->app->log()获取当前日志实例(推荐) - 或通过容器解析:
$log = $this->app->get('log'); - 写入后建议调用
save()强制落盘,避免缓冲未写入:
// 在 command 类的 execute() 方法中
$log = $this->app->log();
$log->info('命令开始执行', ['task' => 'sync_data']);
// ... 业务逻辑
$log->notice('数据同步完成');
$log->save(); // 关键:CLI 下必须显式保存
为命令单独配置日志通道(可选)
若希望命令日志与 Web 日志分离,可在 config/log.php 中新增一个通道,比如 cli:
立即学习“PHP免费学习笔记(深入)”;
- 添加通道配置:
'cli' => ['type' => 'File', 'path' => runtime_path() . 'log/cli/'] - 在命令中指定通道:
$this->app->log()->channel('cli')->info('xxx'); - 同样记得调用
save()
避免常见坑点
- 不要依赖
Log::info()静态方法 —— CLI 下日志门面可能未绑定到实际实例 - 不要省略
save()—— 文件驱动默认缓冲,CLI 执行结束即退出,缓冲可能丢失 - 检查
APP_DEBUG和LOG_LEVEL配置,确保当前级别日志未被过滤(如debug级别在生产环境默认不记录) - 运行命令时加
-v参数(php think your:command -v)可看到调试输出,辅助排查初始化问题



















