laravel-command-streaming maintained by nikolaynesov
Laravel Command Streaming
Stream Laravel Artisan command output to any filesystem disk (local, S3, etc.).
Installation
composer require nikolaynesov/laravel-command-streaming
Publish the configuration file:
php artisan vendor:publish --tag=command-streaming-config
Configuration
// config/command-streaming.php
return [
'enabled' => env('COMMAND_STREAMING_ENABLED', false),
'disk' => env('COMMAND_STREAMING_DISK', 'local'),
'path_prefix' => 'command-logs',
];
Usage
Add the trait and call startStreaming() / stopStreaming():
use Illuminate\Console\Command;
use Nikolaynesov\CommandStreaming\Traits\StreamsCommandOutput;
class MyCommand extends Command
{
use StreamsCommandOutput;
protected $signature = 'my:command';
public function handle(): int
{
$this->startStreaming();
$this->info('This output will be streamed!');
$this->line('Processing...');
$this->error('Any errors are captured too');
$this->stopStreaming();
return 0;
}
}
When COMMAND_STREAMING_ENABLED=true, output between startStreaming() and stopStreaming() is:
- Displayed in the terminal (as normal)
- Written to a log file on the configured disk
Storage
Local (default)
COMMAND_STREAMING_ENABLED=true
COMMAND_STREAMING_DISK=local
Logs saved to storage/app/command-logs/
S3
COMMAND_STREAMING_ENABLED=true
COMMAND_STREAMING_DISK=s3
Custom Disk
// config/filesystems.php
'command-logs' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_COMMAND_LOGS_BUCKET'),
],
COMMAND_STREAMING_DISK=command-logs
Log Format
Logs stored at: {disk}/{path_prefix}/{command-name}/{timestamp}.log
[2025-01-15_10-30-45] Command: my:command
------------------------------------------------------------
Starting...
Processing item 1
Done!
------------------------------------------------------------
[2025-01-15_10-31-02] Command finished
Testing
composer install && ./vendor/bin/pest
License
MIT