Configuración de logs y channels en Laravel
Clase 21 de 33 • Curso Avanzado de Laravel
Contenido del curso
Entorno de trabajo y repaso de Laravel
Manejo de tu base de datos con Laravel
La terminal de Laravel
Eventos y tareas de Laravel
Manejo de errores
El corazón de Laravel
Creación de paquetes
- 26

Cómo crear paquetes Laravel con Composer
08:51 min - 27
Propiedades para manejo de dependencias
02:02 min - 28
Comprende el archivo composer.json
02:23 min - 29

Cómo Composer carga clases automáticamente
04:18 min - 30

Crear mis propios Services Providers
08:58 min - 31

Cómo publicar archivos con Service Provider
04:12 min - 32

Instalando paquetes desde GitHub con Composer
10:35 min - 33

Publicar tu paquete PHP en Packages
03:12 min
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:
.envconLOG_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 siis_adminestá entrue. - Controlador
approve: asignaapproved_atconCarbon::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_adminentrueen 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=trueo?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
AuthServiceProvidery autorización conGate::authorize. - Implementación de ruta protegida para aprobar
rating/{id}/approve. - Actualización de estados con
approved_atusando 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.