Configuración de logs y channels en Laravel

Clase 21 de 33Curso Avanzado de Laravel

Resumen

Aprende a configurar logging por canales en Laravel, registrar eventos con el helper logger, y controlar la aprobación de calificaciones con Gates y Resources. Aquí verás cómo ajustar .env, proteger rutas y filtrar listados por estado aprobado, con ejemplos claros y listos para aplicar.

¿Cómo configurar el logging por canales en Laravel?

Laravel organiza los logs por canales asociados a un driver. En config/logging.php, la variable de entorno LOG_CHANNEL define el canal por defecto: usualmente stack con driver stack, que centraliza todo en un único archivo dentro de storage/logs.

  • Cambia a daily para un archivo de log por día.
  • Ubicación de archivos: storage/logs.
  • Configuración de entorno: .env con LOG_CHANNEL.

Ejemplo para activar el driver diario:

# .env LOG_CHANNEL=daily

Para escribir mensajes, usa el helper logger() desde consola con php artisan tinker y los métodos de nivel: error, info, warning.

php artisan tinker >>> logger()->error('Soy un error'); >>> logger()->info('Soy un mensaje');

Claves que debes retener:

  • Canales y drivers: cada canal usa un driver específico.
  • stack vs daily: un archivo único vs un archivo por día.
  • Niveles de log: error, info, warning, etc.

¿Cómo proteger la aprobación con gates y controladores?

La aprobación de calificaciones queda restringida a usuarios administradores mediante un Gate. En AuthServiceProvider, define la política admin que recibe el usuario y valida que is_admin sea true.

// AuthServiceProvider Gate::define('admin', function ($user) { return $user->is_admin === true; });

En el controlador que aprueba, autoriza con Gate::authorize antes de ejecutar la lógica. El método establece la fecha de aprobación con Carbon::now() y persiste.

// RatingController public function approve(Rating $rating) { Gate::authorize('admin', $rating); $rating->approved_at = Carbon::now(); $rating->save(); return response()->json([], 200); }

Declara una ruta POST protegida por autenticación para rating/{id}/approve que apunte a approve.

// routes/api.php Route::post('rating/{id}/approve', [RatingController::class, 'approve']); // protegida por autenticación

Puntos críticos:

  • Gate admin: autoriza solo si is_admin está en true.
  • Controlador approve: asigna approved_at con Carbon::now() y devuelve 200.
  • Ruta protegida: requiere usuario autenticado con token válido antes de aprobar.

¿Qué hacer si recibes 403 al aprobar?

  • Verifica que el usuario logueado tenga is_admin en true en la base de datos.
  • Asegura que inicias sesión con el correo correcto y usas el token emitido para ese usuario.

¿Cómo listar y filtrar ratings aprobados con resources?

Agrega en tu configuración un campo que permita requerir aprobación:

// config/*.php 'require_approval' => true,

Crea un método list en el controlador (por ejemplo, ProductRatingController) que solo sea visible para administradores. Construye la consulta con un builder del modelo Rating y devuelve una colección con un resource.

// ProductRatingController public function list(Request $request) { Gate::authorize('admin'); $builder = Rating::query(); if ($request->approved) { $builder->whereNotNull('approved_at'); } if ($request->not_approved) { $builder->whereNull('approved_at'); } return RatingResource::collection($builder->get()); }

Define la ruta GET para el listado y pasa filtros como parámetros de consulta: ?approved=true o ?not_approved=true.

// routes/api.php Route::get('rating', [ProductRatingController::class, 'list']);

El resource controla el formato de salida y expone solo los campos necesarios.

// app/Http/Resources/RatingResource.php class RatingResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'rate' => $this->score, 'comments' => $this->comments, 'ratable' => $this->ratable, 'qualifier' => $this->qualifier, 'created_at' => $this->created_at, 'approved_at' => $this->approved_at, ]; } }

Buenas prácticas destacadas:

  • GET con filtros por query: usa ?approved=true o ?not_approved=true.
  • Resources para colecciones: RatingResource::collection($builder->get()).
  • Separación de responsabilidades: Gate para autorización, controlador para lógica y resource para respuesta.

¿Qué habilidades y conceptos clave refuerzas?

  • Configuración de canales de logging y uso de driver daily.
  • Uso del helper logger() con niveles: error, info, warning.
  • Definición de Gates en AuthServiceProvider y autorización con Gate::authorize.
  • Implementación de ruta protegida para aprobar rating/{id}/approve.
  • Actualización de estados con approved_at usando Carbon.
  • Listado con query builder, filtros condicionales y Resources para respuestas limpias.
  • Manejo de errores con la clase Handler y creación de excepciones con mensajes propios.

¿Te gustaría ver ejemplos adicionales de filtros o transformar más campos en el Resource? Comparte tus dudas y casos de uso en los comentarios.