thinkphp8 执行 php think 命令的时候指定日志存储路径

一、在命令类中动态设置日志路径

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('执行业务逻辑...');
    }
}
相关推荐
软件开发技术几秒前
最新网络游戏账户交易平台系统源码 全开源版本 全新UI 自适应移动端
php
酿情师22 分钟前
PHP 反序列化漏洞与 POP 链详解:网络安全小白从零入门
android·web安全·php
xinhuanjieyi44 分钟前
MCP分析某wordpress网站 时间所在的背景动画,并用php框架webman复刻下来
开发语言·php
jwn9991 小时前
Laravel1.x:PHP框架的初心与革新
开发语言·php
软件开发技术1 小时前
最新电子商务购物商城系统源码 三端_H5+微信+安卓
微信·php
BullSmall2 小时前
linux 系统下模拟网络丢失和ping延迟,可以怎么来模拟
linux·网络·php
fengci.2 小时前
php反序列化(复习)(第四章)
android·开发语言·学习·php·android studio
cch89182 小时前
Laravel vs ThinkPHP3.x:现代框架对决
php·laravel
Miss 古月先生3 小时前
thinkphp6.0 html生成pdf
后端·pdf·php
浮尘笔记3 小时前
Docker中安装Kafka以及基本配置和用法、踩坑记录
后端·docker·容器·kafka·php