Laravel
February 19

Управление выводом запланированных задач в Laravel

Нужно отслеживать результаты выполнения запланированных задач? Планировщик Laravel предоставляет элегантные методы для захвата и сохранения результатов выполнения команд для последующего просмотра.

Базовое использование

Сохранение вывода команды в файл:

use Illuminate\Support\Facades\Schedule;

// Сохранение вывода в файл
Schedule::command('emails:send')
    ->daily()
    ->sendOutputTo($filePath);
    
// Добавление вывода в существующий файл
Schedule::command('emails:send')
    ->daily()
    ->appendOutputTo($filePath);

Реальный пример

Расскажите, как реализовать всестороннее журналирование вывода задач:

class TaskScheduler
{
    protected $outputPath = 'storage/logs/scheduled-tasks';
    
    public function registerTasks()
    {
        // Резервное копирование базы данных с журналированием вывода
        Schedule::command('backup:run')
            ->daily()
            ->at('01:00')
            ->appendOutputTo($this->getLogPath('backup'))
            ->before(function () {
                Log::info('Starting database backup...');
            })
            ->after(function () {
                Log::info('Backup process completed');
            });
            
        // Формирование отчетов с отдельными логами
        Schedule::command('reports:generate')
            ->weekly()
            ->mondays()
            ->at('07:00')
            ->sendOutputTo($this->getLogPath('reports'));
            
        // Еженедельная очистка старых логов
        Schedule::call(function () {
            $this->cleanOldLogs();
        })->weekly();
    }
    
    protected function getLogPath($task)
    {
        $date = now()->format('Y-m-d');
        return storage_path(
            "logs/scheduled-tasks/{$task}-{$date}.log"
        );
    }
    
    protected function cleanOldLogs()
    {
        $files = File::files($this->outputPath);
        
        foreach ($files as $file) {
            $age = now()->diffInDays(File::lastModified($file));
            
            if ($age > 30) {
                File::delete($file);
            }
        }
    }
}

Эти методы обработки вывода облегчают отслеживание и отладку запланированных задач.