Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Devlogger Laravel Package

onamfc/laravel-devlogger

Laravel database logger with automatic exception catching and rich metadata. Tag and filter logs by level, date, queue, status, request context, and user. Includes configurable retention/cleanup, fallback channels, and flexible env-based setup.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require onamfc/laravel-devlogger
    php artisan devlogger:install  # New unified command (replaces manual publish/migrate)
    
    • Automatically publishes config (config/devlogger.php) and creates the required logs table.
    • Handles existing tables gracefully (no migration conflicts).
  2. Basic Configuration

    • Update config/devlogger.php to define:
      • log_level (e.g., debug, error, critical)
      • enabled (set to false in production)
      • table_name (default: logs)
      • purge_old_logs (auto-cleanup interval in days)
    • New: Default log_level now set to debug (previously error in some setups).
  3. First Use Case: Automatic Error Logging

    • No manual setup needed—all uncaught exceptions are auto-captured and stored in the DB.
    • View logs via:
      php artisan devlogger:list
      
    • Clear logs:
      php artisan devlogger:purge
      

Implementation Patterns

1. Manual Logging

Replace Log::error() with DevLogger’s fluent interface:

use Onamfc\DevLogger\Facades\DevLogger;

// Log with context (auto-attaches user, IP, etc.)
DevLogger::error("Failed to process order", [
    'order_id' => 123,
    'user_id'  => auth()->id(),
]);

// Log with custom metadata
DevLogger::debug("API request received", [
    'endpoint' => 'users/create',
    'payload'  => $request->all(),
]);

2. Middleware for Request Logging

Log HTTP requests/responses in middleware:

use Onamfc\DevLogger\Facades\DevLogger;

public function handle($request, Closure $next)
{
    $start = microtime(true);
    $response = $next($request);
    $duration = microtime(true) - $start;

    DevLogger::info("Request processed", [
        'method'   => $request->method(),
        'url'      => $request->fullUrl(),
        'duration' => $duration,
        'status'   => $response->getStatusCode(),
    ]);

    return $response;
}

3. Filtering and Querying Logs

Use the DevLogger facade to fetch logs programmatically:

// Get last 10 errors for a user
$logs = DevLogger::query()
    ->where('level', 'error')
    ->where('context->user_id', auth()->id())
    ->orderBy('created_at', 'desc')
    ->limit(10)
    ->get();

// Filter by custom metadata
$logs = DevLogger::query()
    ->where('context->order_id', 123)
    ->get();

4. Scheduling Log Purge

Add to app/Console/Kernel.php:

protected function schedule(Schedule $schedule)
{
    $schedule->command('devlogger:purge')->dailyAt('03:00');
}

5. Extending Log Context

Auto-attach metadata via service provider binding:

// In AppServiceProvider@boot()
DevLogger::extend(function ($logger) {
    $logger->setContext('custom_key', 'custom_value');
});

6. New: Log Retention Configuration

Configure retention policies directly in config/devlogger.php:

'retention' => [
    'max_days' => 30,       // Default: 30 days
    'soft_delete' => true,  // Enable soft deletes (default: false)
],
  • Soft deletes now supported for compliance (logs marked as deleted but retained).

Gotchas and Tips

Pitfalls

  1. Deprecated Commands

    • php artisan vendor:publish --provider="Onamfc\DevLogger\DevLoggerServiceProvider" is no longer needed.
    • Use php artisan devlogger:install instead (handles config + migrations).
  2. Performance Overhead

    • Database writes add latency. Avoid logging in tight loops (e.g., bulk operations).
    • Fix: Use DevLogger::disable() in performance-critical paths:
      DevLogger::disable();
      // ... bulk operations ...
      DevLogger::enable();
      
  3. Context Data Size Limits

    • The context column uses JSON storage. Large payloads may bloat the DB.
    • Fix: Log only essential data or use DevLogger::logRaw() for large payloads.
  4. Log Level Defaults

    • Default log_level is now debug (previously error in some setups).
    • Fix: Explicitly set log_level in config/devlogger.php if stricter filtering is needed.
  5. Soft Delete Conflicts

    • If soft_delete is enabled but the logs table lacks a deleted_at column, migrations will fail.
    • Fix: Run php artisan devlogger:install --force to update the schema.

Debugging Tips

  • Check Raw Queries: Enable Laravel’s query logging to debug slow log queries:
    DB::enableQueryLog();
    DevLogger::error("Test");
    dd(DB::getQueryLog());
    
  • Inspect Context Data: Use DevLogger::getLastLog() to debug context attachment:
    $lastLog = DevLogger::getLastLog();
    dd($lastLog->context);
    
  • Purge Issues: If devlogger:purge fails:
    • Check database permissions.
    • Verify purge_old_logs config (must be > 0).
    • For soft deletes, ensure deleted_at column exists.

Extension Points

  1. Custom Log Levels Extend the level column by modifying the migration or using a trait:

    // app/Models/Log.php
    use Onamfc\DevLogger\Traits\LogLevelTrait;
    
    class Log extends Model
    {
        use LogLevelTrait;
    
        protected $casts = [
            'level' => 'string',
        ];
    }
    
  2. Web Interface Build a custom admin panel using the logs table. Example query for a dashboard:

    $stats = DevLogger::query()
        ->selectRaw('level, count(*) as count')
        ->groupBy('level')
        ->get();
    
  3. Slack/Email Alerts Hook into log events via the DevLogger event system:

    // In EventServiceProvider@boot()
    DevLogger::listen(function ($log) {
        if ($log->level === 'critical') {
            Notification::route('slack', config('services.slack.webhook'))
                ->notify(new CriticalLogAlert($log));
        }
    });
    
  4. Rate Limiting Prevent log spam by throttling in middleware:

    use Illuminate\Cache\RateLimiter;
    
    public function handle($request, Closure $next)
    {
        $limiter = app(RateLimiter::class);
        if ($limiter->tooManyAttempts($this->throttleKey($request), 10)) {
            DevLogger::warning("Rate limit exceeded for IP: {$request->ip()}");
        }
        return $next($request);
    }
    
  5. New: Retention Policies

    • Use devlogger:prune to manually enforce retention:
      php artisan devlogger:prune --days=7  # Delete logs older than 7 days
      
    • Schedule pruning in app/Console/Kernel.php:
      $schedule->command('devlogger:prune --days=' . config('devlogger.retention.max_days'))
               ->dailyAt('02:00');
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky