Pregunta

Me gustaría agregar algunos datos a todos los registros dentro de mi aplicación Laravel.

Creo que sería útil saber el nombre de usuario del usuario actual y/o la dirección IP del cliente.

Actualmente lo estoy agregando manualmente haciendo:

Log::info('Pre-paid activation.', array('username' => Auth::user()->username));

Pero me gustaría saber cómo agregar un oyente o algo para hacer todo log recorde tiene el nombre de usuario (si está disponible).

¿Fue útil?

Solución

Dado que Laravel viene de fábrica con Monólogo, Es bastante sencillo.Se puede lograr fácilmente editando app/start/global.php y agregue lo siguiente después de la línea que comienza con: Log::useFiles:

Log::useFiles(storage_path().'/logs/laravel.log');
$monolog = Log::getMonolog();
$monolog->pushProcessor(function ($record) {
    $record['extra']['user'] = Auth::user() ? Auth::user()->username : 'anonymous';
    $record['extra']['ip'] = Request::getClientIp();
    return $record;
});

Básicamente, estamos utilizando la instancia subyacente de Monolog para registrar un procesador que interceptará cualquier registro que se escriba.Los resultados serán similares a los siguientes:

[2014-04-12 23:07:35] local.INFO:Activación prepago.[] {"usuario":"anonimo","ip":"::1"}

Más información sobre los procesadores Monolog: https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors


Extra: El codificado extra es decirle a Monolog que agregue datos como información adicional (es redundante decirlo).En la práctica, esto es para evitar anular cualquier dato de contexto agregado en la llamada de registro original.

Otros consejos

en Laravel 5 Puedes hacerlo personalizando Monolog.Primero cree una clase que personaliza MONOG, por lo que agrega la información del usuario a los registros de registro:

namespace App\Logging;

use App\Models\User;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Log\Logger;

class AddUserInformation
{
    protected $request;

    public function __construct(Request $request = null)
    {
        $this->request = $request;
    }

    public function __invoke(Logger $logger)
    {
        if ($this->request) {
            foreach ($logger->getHandlers() as $handler) {
                $handler->pushProcessor([$this, 'processLogRecord']);
            }
        }
    }

    public function processLogRecord(array $record): array
    {
        $record['extra'] += [
            'user' => $this->request->user()->username ?? 'guest',
            'ip' => $this->request->getClientIp()
        ];

        return $record;
    }
}

Luego, conecte la clase al registrador de Laraver agregándolo a la configuración del canal en el archivo config/logging.php:

// ...
'channels' => [
    'single' => [
        'driver' => 'single',
        'tap' => [\App\Logging\AddUserInformation::class],
        'path' => storage_path('logs/laravel.log'),
        'level' => env('LOG_LEVEL', 'debug'),
    ],
    // ...
]

Una documentación sobre la personalización de Monolog

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top