Monolog Logging Bridge

Installation

composer require larafony/log-monolog

Configuration

Register the service provider in your bootstrap.php:

use Larafony\Log\Monolog\ServiceProviders\MonologServiceProvider;

$app->withServiceProviders([
MonologServiceProvider::class
]);

Create config/logging.php:

return [
'default' => 'stack',

'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'slack'],
],

'single' => [
'driver' => 'single',
'path' => storage_path('logs/app.log'),
'level' => 'debug',
],

'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/app.log'),
'level' => 'debug',
'days' => 14,
],

'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'level' => 'critical',
],

'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
],
];

Basic Usage

use Psr\Log\LoggerInterface;
use Larafony\Framework\Web\Controller;
use Larafony\Framework\Routing\Advanced\Attributes\Route;
use Larafony\Framework\Http\Factories\ResponseFactory;

final class OrderController extends Controller
{
#[Route('/orders/<id:\d+>', methods: ['POST'])]
public function process(LoggerInterface $logger, int $id): \Psr\Http\Message\ResponseInterface
{
$logger->info('Processing order', ['order_id' => $id]);

try {
// Process order...
$logger->debug('Order validated successfully');

return new ResponseFactory()->createJsonResponse(['status' => 'completed']);
} catch (\Exception $e) {
$logger->error('Order processing failed', [
'order_id' => $id,
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);

return new ResponseFactory()->createJsonResponse(['error' => 'Failed'], 500);
}
}
}

Multiple Channels

use Larafony\Log\Monolog\MonologManager;

final class AlertController extends Controller
{
#[Route('/send-alert', methods: ['POST'])]
public function sendAlert(MonologManager $manager): ResponseInterface
{
// Log to specific channel
$manager->channel('slack')->critical('Server down!');
$manager->channel('daily')->info('Daily report generated');

// Log to multiple channels at once
$manager->stack(['daily', 'slack'])->alert('Security breach detected');

return new ResponseFactory()->createJsonResponse(['alerted' => true]);
}
}

Contextual Logging

// Add context to all subsequent logs
$logger->withContext(['request_id' => $requestId, 'user_id' => $userId]);

$logger->info('Processing started'); // includes request_id and user_id
$logger->info('Step 1 complete'); // includes request_id and user_id
$logger->info('Processing complete'); // includes request_id and user_id

Available Handlers

Features

Info: Why Monolog? While Larafony includes a built-in PSR-3 logger, Monolog offers 50+ handlers for different destinations, processors to enrich log data automatically, and industry-standard logging used by Symfony, Laravel, and many others.