一、在命令类中动态设置日志路径
php
<?php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Log;
class CustomTask extends Command
{
protected function configure()
{
$this->setName('custom:task')
->setDescription('自定义任务命令')
->addOption('log-path', 'l', Option::VALUE_OPTIONAL, '指定日志路径')
->addOption('log-level', null, Option::VALUE_OPTIONAL, '日志级别', 'info');
}
protected function execute(Input $input, Output $output)
{
// 设置日志路径
$logPath = $input->getOption('log-path')
?: app()->getRuntimePath() . 'logs/command/' . date('Y-m-d') . '/';
$this->setupCommandLog($logPath);
$logLevel = $input->getOption('log-level');
Log::info('命令开始执行', [
'command' => $this->getName(),
'log_path' => $logPath,
'log_level' => $logLevel
]);
$output->writeln("日志路径: {$logPath}");
try {
// 业务逻辑
$this->handleTask($output);
Log::info('命令执行成功');
$output->writeln('<info>任务完成</info>');
} catch (\Exception $e) {
Log::error('命令执行失败: ' . $e->getMessage());
$output->writeln('<error>执行失败: ' . $e->getMessage() . '</error>');
return 1;
}
return 0;
}
protected function handleTask(Output $output)
{
for ($i = 1; $i <= 3; $i++) {
$message = "处理第 {$i} 个任务";
Log::info($message);
$output->writeln($message);
sleep(1);
}
}
protected function setupCommandLog($path)
{
// 确保目录存在
if (!is_dir($path)) {
mkdir($path, 0755, true);
}
// 动态配置日志
config([
'log.channels.command' => [
'type' => 'File',
'path' => $path,
'level' => ['info', 'error', 'debug'],
'single' => false,
'max_files' => 10,
]
]);
// 设置为默认日志通道
config(['log.default' => 'command']);
}
}
二、使用环境变量指定日志路径
php
<?php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Log;
use think\facade\Env;
class EnvTask extends Command
{
protected function configure()
{
$this->setName('env:task')
->setDescription('使用环境变量配置日志');
}
protected function execute(Input $input, Output $output)
{
// 从环境变量获取日志路径
$logPath = Env::get('command_log_path', app()->getRuntimePath() . 'logs/command/');
$logLevel = Env::get('command_log_level', 'info');
$this->setupLogging($logPath, $logLevel);
Log::info('环境变量命令开始执行');
$output->writeln("使用日志路径: {$logPath}");
// 业务逻辑
$this->runBusinessLogic($output);
Log::info('环境变量命令执行完成');
$output->writeln('<info>完成</info>');
return 0;
}
protected function setupLogging($path, $level)
{
config([
'log' => [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'File',
'path' => $path,
'level' => $level,
'single' => false,
'max_files' => 30,
],
],
]
]);
}
protected function runBusinessLogic(Output $output)
{
// 业务代码
$output->writeln('执行业务逻辑...');
}
}