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('执行业务逻辑...');
    }
}
相关推荐
那年窗外下的雪.7 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
COOLMO研究AI9 小时前
Python 如何在 AI 接口中实现请求幂等性:防止重复提交与重复扣费
人工智能·python·php
西安景驰电子10 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
wavemap12 小时前
HyperPHP 免费主机无限流量
服务器·php
长江&后浪13 小时前
防火墙的描述
开发语言·网络·php
三84414 小时前
文件包含基础
php
qq_448011161 天前
C语言中的动态内存分配
c语言·开发语言·php
叠层归一研究院1 天前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
数据知道1 天前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
江畔柳前堤1 天前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php