Para agregar un handler personalizado en el archivo de configuración de logging en Laravel, sigue estos pasos:
-
Abre el archivo
config/logging.php
. -
Agrega la siguiente configuración en el array de canales (
channels
):
'database' => [
'driver' => 'monolog',
'handler' => App\Logging\DatabaseLogger::class,
],
Para registrar los logs en la base de datos, puedes crear una tabla utilizando una migración. A continuación, se muestra el código necesario:
- Crea una nueva migración ejecutando el comando:
php artisan make:migration create_logs_table
- Abre el archivo de migración generado en el directorio
database/migrations
y actualiza el métodoup
con el siguiente código:
Schema::create('logs', function (Blueprint $table) {
$table->id();
$table->text('message');
$table->string('level_name');
$table->json('context')->nullable();
$table->string('loggable_id')->nullable();
$table->string('loggable_type')->nullable();
$table->timestamps();
$table->softDeletes();
});
- Aplica la migración para crear la tabla ejecutando el comando:
php artisan migrate
Para implementar un sistema de logs reutilizable en cualquier modelo de tu aplicación, puedes usar relaciones morfológicas en Laravel.
- Definición en el modelo
Log
:
El modelo Log
contiene la relación morfológica loggable
, definida de la siguiente manera:
public function loggable(): \Illuminate\Database\Eloquent\Relations\MorphTo
{
return $this->morphTo();
}
Esto permite que cada entrada en la tabla de logs esté asociada a cualquier modelo que implemente esta relación morfológica.
- Definición en los modelos que usarán logs:
En cualquier modelo donde quieras registrar logs, simplemente agrega la siguiente relación (contenida en el trati HasLogs):
public function logs(): \Illuminate\Database\Eloquent\Relations\MorphMany
{
return $this->morphMany(Log::class, 'loggable');
}
- Por qué funciona:
- Laravel usa relaciones morfológicas para permitir que un modelo tenga relaciones polimórficas con múltiples tipos de modelos.
- La función
morphTo
en el modeloLog
conecta automáticamente los camposloggable_id
yloggable_type
con el modelo correspondiente. - La función
morphMany
en los otros modelos permite acceder a todos los registros de logs relacionados con ese modelo.
- Ejemplo de uso:
Si tienes un modelo User
y deseas registrar logs relacionados con un usuario:
$user = User::find(1);
Log::channel('database')->error('Mensaje', [$user, /** Cualquier estructura array[] */)]);
Tamiben es posible utilizar los logs en general, sin necesidad que tener algun modelo
$user = User::find(1);
Log::channel('database')->error('Mensaje', ['user_id' => 1)]);
Con este enfoque, puedes reutilizar el sistema de logs en cualquier modelo de tu aplicación con facilidad.
- Recomendaciones:
Al porder guardar cualquier estructura como contexto, simplemente adapte el array segun la necesidad que requiera (Como guardar un cierto array y volver a leerlo con una clase casteada).