Laravel Logging Best Practices
Laravel's logging system is built on Monolog and supports sophisticated multi-channel configurations. Here's how to set it up for production.
Configure Log Channels
// config/logging.php
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'stderr'],
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'info',
'days' => 14,
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'with' => ['stream' => 'php://stderr'],
'formatter' => JsonFormatter::class,
],
'audit' => [
'driver' => 'daily',
'path' => storage_path('logs/audit.log'),
'level' => 'info',
'days' => 90,
],
],Add Contextual Information
// Middleware to add request context
class LogContext
{
public function handle(Request $request, Closure $next)
{
Log::shareContext([
'request_id' => $request->header('X-Request-ID', Str::uuid()),
'user_id' => $request->user()?->id,
'ip' => $request->ip(),
]);
return $next($request);
}
}Structured Logging
// Good: structured data
Log::info('Order created', [
'order_id' => $order->id,
'user_id' => $order->user_id,
'total' => $order->total,
'items_count' => $order->items->count(),
]);
// Bad: string interpolation
Log::info("Order {$order->id} created by user {$order->user_id}");Log Levels Guide
- emergency/alert/critical — system is unusable, immediate action needed
- error — runtime errors, exception caught
- warning — unusual but handled (retry succeeded, deprecation)
- info — significant events (user login, order placed)
- debug — disabled in production
Sensitive Data
// config/logging.php — replace sensitive fields
'tap' => [RedactSensitiveData::class],
class RedactSensitiveData
{
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->pushProcessor(function ($record) {
// Redact sensitive fields from context
$sensitive = ['password', 'token', 'credit_card'];
foreach ($sensitive as $key) {
if (isset($record['context'][$key])) {
$record['context'][$key] = '[REDACTED]';
}
}
return $record;
});
}
}
}Pair your logging setup with Bugsly's error tracking. Logs provide the narrative context; Bugsly captures the exact exception with stack traces and request data.
Try Bugsly Free
Track up to 100 issues per month on the free plan, with unlimited events and no credit card required.
Get Started FreeRelated Articles
Java Error Handling Patterns for Modern Applications
Master Java error handling with custom exceptions, global handlers in Spring Boot, Optional patterns, and structured error responses.
Read moreSvelteKit Logging: Server and Client Error Guide
Set up SvelteKit logging with server and client hooks, structured JSON server logs, request IDs and timing, plus client error capture with code examples.
Read moreFlask Production Best Practices
Essential Flask best practices for production including application factories, blueprints, configuration management, and error handling patterns.
Read moreLaravel Error Handling Patterns
Master Laravel error handling with custom exceptions, the Handler class, renderable exceptions, and API error response formatting.
Read moreFrom the same team
SEOBolt
Technical SEO and AI search audits with ready-to-apply fix plans.
Try SEOBolt →GrowFast
Domain in, qualified B2B leads out, with cold outreach and deliverability handled.
Try GrowFast →AutoShort
Turn a topic into a faceless short: AI script, voiceover and captions.
Try AutoShort →RemixViral
Paste a long video and get back the moments worth posting, cut vertical and captioned.
Try RemixViral →