How to Automatically Add User Info to Logs

Log::withContext adds a global context to all logs within the current request.


Log::withContext in Laravel allows you to add extra information (like user details or other relevant data) to every log entry automatically, without having to repeat it in each log message.

For example, if you want to track which user is triggering actions in your application, you can use Log::withContext to include the user’s ID in all logs for better debugging and tracking.

Log User info without Log::withContext

\Log::info('User has logged in.', ['id' => auth()->id()]);

// output: local.INFO: User has logged in. {"id":1} 

Log User info with Log::withContext

// in handle function of a middleware
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class MyMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): 
     * (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        Log::withContext([
            'user-id' => auth()->id()
        ]);

        return $next($request);
    }
}

then in controller or anywhere you want to create a log

Route::get('/log', function () {
    \Log::info('User performed an action');
})->middleware('my.middleware');

// output: local.INFO: User performed an action {"user-id":1} 

Log::withContext: Adds a global context (e.g., user_id) to all logs within the current request. This means every log entry made afterward will automatically include the user_id in the context.

auth()->id(): Retrieves the currently authenticated user’s ID.

You Might Also Like

Implicit and Explicit Route Model Binding

## 1. Implicit Route Model Binding ``` // Define a route with implicit model binding Route::get('us...

Use Blade Layouts for Consistency

Utilize Blade layouts to maintain consistent structure and reduce redundancy across your application...