phrity/logger-console
PSR-3 compatible console logger for local tests and CLI apps. Configure verbosity levels (quiet to debug), customize output format with placeholders (datetime, level, message, context), and optionally read verbosity from CLI flags like -q/-v/-vv/-vvv.
composer require phrity/logger-console
use Phrity\Logger\Console\ConsoleLogger;
$logger = new ConsoleLogger();
$logger->info('Application started');
echo or Log::info() in an Artisan command:
use Phrity\Logger\Console\ConsoleLogger;
protected $logger;
public function __construct() {
$this->logger = new ConsoleLogger(cliOptions: true);
}
public function handle() {
$this->logger->info('Command executing', ['user_id' => 1]);
}
Run with:
php artisan my:command --verbose
Verbosity::class for available levels (Quiet, Normal, Verbose, etc.).$logger = new ConsoleLogger(format: '{datetime} [{level}] {message} - {context}');
cliOptions: true to support --verbose flags.Artisan Command Integration:
use Phrity\Logger\Console\ConsoleLogger;
class MyCommand extends Command {
protected $logger;
public function __construct() {
parent::__construct();
$this->logger = new ConsoleLogger(cliOptions: true);
}
public function handle() {
$this->logger->debug('Debug details', ['data' => $this->getData()]);
$this->logger->info('User processed', ['user_id' => 123]);
}
}
Run with:
php artisan my:command -vvv # Debug level
Test Logging:
Replace var_dump() or echo in tests:
use Phrity\Logger\Console\ConsoleLogger;
$logger = new ConsoleLogger(verbosity: Verbosity::Verbose);
$logger->debug('Test data:', ['response' => $response]);
Queue Job Logging:
Log job progress in handle():
use Phrity\Logger\Console\ConsoleLogger;
$logger = new ConsoleLogger();
$logger->info('Processing job', ['job_id' => $job->id]);
Laravel Service Provider:
Bind ConsoleLogger to the container for dependency injection:
$this->app->bind(ConsoleLogger::class, function ($app) {
return new ConsoleLogger(
verbosity: $app['config']['logging.verbosity'],
cliOptions: true
);
});
Use in commands:
use Phrity\Logger\Console\ConsoleLogger;
protected $logger;
public function __construct(ConsoleLogger $logger) {
$this->logger = $logger;
}
Dynamic Verbosity:
Set verbosity via .env:
LOG_VERBOSITY=verbose
Load in ConsoleLogger:
$logger = new ConsoleLogger(verbosity: env('LOG_VERBOSITY', 'normal'));
Contextual Logging: Pass arrays for structured context:
$logger->info('User action', [
'user_id' => 1,
'action' => 'login',
'ip' => request()->ip(),
]);
Format Reusability:
Define formats in config/logging.php:
'console_formats' => [
'default' => '{datetime} [{level}] {message}',
'verbose' => '{datetime} [{level}] {message} - {context}',
],
Use dynamically:
$format = config('logging.console_formats.verbose');
$logger = new ConsoleLogger(format: $format);
CLI Option Conflicts:
cliOptions: true is enabled, ensure your CLI tool’s arguments don’t conflict with the package’s flags (e.g., --verbose). Use -- to delimit:
php artisan my:command -- --verbose
Format Parsing Errors:
{invalid}) will throw exceptions. Validate formats:
$format = '{datetime} [{level}] {message}'; // Valid
$logger = new ConsoleLogger(format: $format);
Verbosity Overhead:
Debug level logs can flood output. Use sparingly in production-like environments.Context Serialization:
context may not serialize cleanly. Use arrays or JSON-serializable data:
$logger->info('Data', ['user' => (array) $user]); // Cast to array
Dependency Conflicts:
phrity/util-*. Check for version conflicts with Laravel’s dependencies:
composer why phrity/util-
Log Level Toggling:
php artisan my:command --verbose # Verbose
php artisan my:command -vvv # Debug
Format Testing:
$logger = new ConsoleLogger(format: '{level}: {message}');
$logger->info('Test', ['key' => 'value']); // Output: INFO: Test - array:1 [▶]
Fallback to Monolog:
ConsoleLogger fails, fall back to Monolog:
try {
$logger = new ConsoleLogger();
} catch (\Exception $e) {
$logger = \Log::channel('stack'); // Fallback
}
Context Inspection:
json_encode() to debug context serialization:
$context = ['data' => new stdClass()];
$logger->info('Check context', ['context' => json_encode($context)]);
Custom Verbosity Levels:
Extend Verbosity enum (PHP 8.1+):
enum Verbosity {
case Trace;
// ...
}
Additional Replacers: Add custom replacers by extending the logger:
class ExtendedLogger extends ConsoleLogger {
protected function replaceContext(string $message, array $context): string {
$message = parent::replaceContext($message, $context);
return str_replace('{custom}', $context['custom'] ?? '', $message);
}
}
Symfony Console Integration:
Use Symfony’s Output interface for advanced formatting:
use Symfony\Component\Console\Output\ConsoleOutput;
$output = new ConsoleOutput();
$logger = new ConsoleLogger(output: $output);
Log Routing: Route logs to multiple outputs (e.g., console + file):
use Symfony\Component\Console\Output\BufferedOutput;
$bufferedOutput = new BufferedOutput();
$logger = new ConsoleLogger(output: $bufferedOutput);
// Later: $bufferedOutput->fetch();
Default Verbosity:
The default is Verbosity::Normal. Override via constructor or .env:
$logger = new ConsoleLogger(verbosity: Verbosity::Verbose);
Format Escaping: Escape curly braces in messages by doubling them:
$logger->info('Message with {{curly braces}}'); // Output: Message with {curly braces}
Context Order: Context keys are inserted in order. Sort if order matters:
ksort($context);
$logger->info('Data', $context);
Performance:
High verbosity levels (e.g., Debug) can impact performance. Benchmark in critical paths:
php artisan my:command --verbose # Test performance
How can I help you explore Laravel packages today?