Registro de Laravel: todo lo que necesita saber

Publicado: 2022-08-19

Al desarrollar una aplicación moderna, el registro debe estar en la parte superior de la lista de prioridades.

El registro proporciona una forma de visualizar su aplicación tanto en desarrollo como en producción, lo que permite la transparencia y la visibilidad. Con un registro correctamente estructurado, las aplicaciones modernas pueden volverse más fáciles de mantener, ya que podemos identificar de manera proactiva los puntos de falla y los cuellos de botella en el rendimiento de nuestra aplicación.

El marco de Laravel viene con un sistema de registro robusto que maneja todos los obstáculos involucrados en la configuración de un sistema de registro correctamente estructurado listo para usar. Este nuevo sistema de registro introducido en Laravel 6.5 es poderoso y lo exploraremos en este artículo.

Este artículo explorará los conceptos básicos del registro de Laravel y por qué debería usar el registro de Laravel en su próximo proyecto. Discutiremos el registro estructurado y el registro centralizado en detalle. Además, aprenderemos cómo implementar el registro de Laravel mediante la creación de una aplicación Todo.

Obtendrá más de este artículo si ya tiene lo siguiente en su haber:

  • Buen conocimiento de desarrollo web.
  • Comprensión básica de Laravel
  • Construyendo aplicaciones con Laravel

¿Qué es el registro de Laravel?

El registro de Laravel tiene que ver con cómo Laravel maneja el registro, o el informe automático de problemas, utilizando un sistema de registro de PHP viral llamado Monolog. Sin embargo, debido a la filosofía de Laravel de usar bibliotecas populares existentes para implementar diferentes funciones de marco, Laravel emplea Monolog para todas sus necesidades de registro.

Monolog es una biblioteca de registro PHP altamente flexible y popular que podemos configurar para enviar sus registros a archivos, sockets, bases de datos y otros servicios web. Monolog proporciona una interfaz familiar para escribir registros desde archivos de texto estándar hasta servicios avanzados de administración de registros de terceros. Laravel normalmente configura Monolog para usar un archivo de configuración de registro estándar.

Para obtener más información sobre Monolog y sus características, consulte la documentación oficial, ya que está más allá del alcance de este artículo.

Antes de sumergirnos en la configuración e implementación del registro de Laravel usando Monolog, exploremos más razones para usar el registro de Laravel y los diferentes tipos.

¿Por qué usar el registro de Laravel?

¿Por qué es necesario iniciar sesión?

El manifiesto de la aplicación Twelve-Factor trata el registro como una de las preocupaciones críticas de una aplicación moderna, ya que el registro es clave para el rendimiento y la supervisión.

Los registros ayudan en la comprensión detallada de los errores que ocurren en la producción y dónde se originaron. Además, con las estructuras de registro adecuadas, puede mostrar al usuario en particular, la acción que causó el error y la posible solución para una reparación y un mantenimiento más rápidos.

El registro estructurado es un salvavidas en las aplicaciones de producción al ayudar a solucionar defectos y resolver problemas en la producción. Además, puede monitorear y recopilar todos sus mensajes de registro en tiempo real utilizando herramientas de registro especializadas para análisis e informes en vivo.

Por estas razones, debe hacer que el registro estructurado sea una prioridad principal en su próximo proyecto de aplicación moderna.

Veamos la descripción general de los diferentes estilos de registro disponibles.

Conceptos básicos del registro de Laravel

Aprender los conceptos básicos del registro lo ayudará a comprender cómo Laravel maneja el registro y cómo puede mejorar sus prácticas de registro estructurado.

Examinemos dos conceptos esenciales en el registro para comprender mejor cómo implementar nuestros procedimientos de registro.

Registro estructurado de Laravel

En el desarrollo de software, el registro estructurado implementa un formato de mensaje predeterminado y coherente para los registros de aplicaciones. Este formato permite que los mensajes se traten como datos que se pueden monitorear, manipular y visualizar mucho mejor que el formato de texto normal.

Debe implementar un enfoque de registro estructurado en el desarrollo de su aplicación moderna porque los archivos de registro son los activos esenciales para los desarrolladores cuando le sucede algo incorrecto a su aplicación en producción.

Dado que Laravel usa Monolog, los desarrolladores pueden implementar rápidamente el registro estructurado al configurar el registrador para recibir tipos específicos de información, almacenar los archivos de registro en diferentes formatos y enviar los registros a varios servicios de administración de registros de terceros para su visualización.

Registro centralizado de Laravel

Un sistema de registro centralizado es donde los registros se envían a las soluciones de administración centralizada de registros (CLM) desde múltiples fuentes para una fácil consolidación y visualización. Sin embargo, CLM es una solución de registro especializada que recopila mensajes de registro de diferentes fuentes y consolida los datos para facilitar el procesamiento y la visualización.

Además de la recopilación de datos, también se espera que CLM admita el análisis de datos de registro y una presentación clara de los datos después del análisis.

Registro estructurado frente a registro básico

Examinemos la diferencia entre el registro estructurado y el registro básico (no estructurado) y por qué debería usar el registro estructurado en su proyecto Laravel.

Registro básico

En el registro básico, los archivos de registro se almacenan en un formato sin procesar con datos limitados para consultar e identificar registros individuales.

Al usar el registro básico, los desarrolladores no podrán usar herramientas analíticas de terceros para leer, ver y analizar registros a menos que desarrollen una herramienta personalizada o se apeguen a una herramienta limitada que admita su formato de registro.

Hay tres grandes razones para evitar el uso de registros básicos:

  1. Los sistemas de gestión de registros centralizados no pueden trabajar con los datos sin soporte adicional.
  2. Se requiere una solución personalizada para leer y analizar los datos de una solución de registro básica.
  3. Puede ser un desafío para los administradores leer los datos de registro básicos, ya que están sin procesar y sin estructura.

Registro estructurado

El registro estructurado ahorra tiempo a los desarrolladores mediante el uso de herramientas analíticas de registro de terceros de código abierto que admiten la estructura de registro estándar para leer, ver y analizar registros.

Los registros son útiles si contienen los datos correctos que se enumeran a continuación, que es lo que pretende lograr el registro estructurado. Podemos usar los datos incluidos en el registro estructurado para crear paneles, gráficos, tablas y cualquier otra visualización útil para determinar el estado de la aplicación.

Estos son ejemplos básicos de la información que podemos incluir en los mensajes de registro estructurados. Además, puede personalizar completamente los datos para adaptarlos a sus necesidades.

Estos son algunos ejemplos de los datos que puede recopilar con el registro estructurado:

  1. El puerto utilizado para ejecutar la función.
  2. La fecha y hora en que ocurrió el evento.
  3. El nombre de usuario o ID del cliente
  4. Una descripción del evento (mensaje de registro)
  5. El protocolo utilizado para ejecutar la función.
  6. La ubicación del evento desencadenado (indicar API o aplicación en ejecución)
  7. El ID de evento único
  8. El tipo de acción desencadenada (nivel de registro)

Los registros deben contener suficientes datos para visualizar fácilmente la solución o el motivo del evento de registro. Además, tenga en cuenta que no debe almacenar todo tipo de información, como contraseñas o datos confidenciales en los registros.

Ahora que hemos vislumbrado de qué se trata el registro de Laravel, pasemos a implementar el registro de Laravel mediante la creación de una aplicación con el registro como un ciudadano de primera clase.

Cómo implementar el registro de Laravel con la aplicación Todo

Ahora vamos a aplicar lo que hemos aprendido hasta ahora creando un nuevo proyecto de Laravel e implementando el registro de Laravel.

Si no ha usado Laravel antes, puede leer qué es Laravel o echar un vistazo a nuestra lista de excelentes tutoriales de Laravel para comenzar.

Configurando Laravel

Primero, vamos a crear una nueva instancia de Laravel usando el siguiente comando. Puede consultar la documentación oficial para obtener más información.

Abra su consola y navegue hasta donde almacena sus proyectos PHP antes de ejecutar los comandos a continuación. Asegúrese de tener Composer instalado y configurado correctamente.

 composer create-project laravel/laravel laravel-logging-app cd laravel-logging-app // Change directory to current Laravel installation php artisan serve // Start Laravel development server

Configuración y siembra de la base de datos

A continuación, configuraremos nuestra base de datos, crearemos un nuevo modelo de Todo y sembraremos 200 datos falsos para realizar pruebas.

Abra su cliente de base de datos y cree una nueva base de datos. Haremos lo mismo con el nombre laravel_logging_app_db y luego llenaremos nuestro archivo .env con las credenciales de la base de datos:

 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_logging_app_db DB_USERNAME=//DB USERNAME HERE DB_PASSWORD=//DB PASSWORD HERE

A continuación, ejecutaremos el siguiente comando para crear la migración y el modelo Todo simultáneamente:

 php artisan make:model Todo -mc

Abra la base de datos/migraciones/xxx-create-todos-xxx.php recién creada y pegue los siguientes códigos:

 <?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateTodosTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('description')->nullable(); $table->boolean('is_completed')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('todos'); } }

Puede sembrar sus todos con datos falsos aprendiendo a sembrar sus bases de datos en Laravel usando Faker.

¿Luchando con el tiempo de inactividad y los problemas de WordPress? ¡Kinsta es la solución de hospedaje diseñada para ahorrarle tiempo! Echa un vistazo a nuestras características

Descripción general de Monólogo

Con Laravel Monolog, puede transmitir y enviar registros estructurados a diferentes canales, como correos electrónicos, Slack, archivos, sockets, bandejas de entrada, bases de datos y varios servicios web. En Laravel, puede configurar el registro desde un único archivo de configuración ubicado en config/logging.php .

El archivo de configuración viene con controladores de registro predefinidos para elegir, y el controlador predeterminado es una stack que usa el canal single para iniciar sesión en un archivo laravel.log que se encuentra en la carpeta de almacenamiento/registros . Demostraremos el registro estructurado mediante el uso de un par de controladores de registro de Laravel.

Laravel proporciona varios métodos para interactuar con los registros, como se demuestra en general en el archivo del controlador TodosController.php en breve.

Escritura de mensajes de registro en el controlador

Abra el archivo del controlador TodosController.php recién creado que se encuentra en la carpeta app/Http/Controllers y pegue los siguientes códigos:

 <?php namespace AppHttpControllers; use AppModelsTodo; use IlluminateHttpRequest; use AppHttpControllersController; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesLog; class TodosController extends Controller { public function index(Request $request) { $todos = Todo::all(); Log::warning('User is accessing all the Todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function byUserId(Request $request) { $todos = Todo::where('user_id', Auth::user()->id)->get(); Log::info('User is accessing all his todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function show(Request $request, $id) { $todo = Todo::find($id); Log::info('User is accessing a single todo', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show')->with(['todo' => $todo]); } public function update(Request $request, $id) { # Validations before updating $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); Log::warning('Todo found for updating by user', ['user' => Auth::user()->id, 'todo' => $todo]); if ($todo) { $todo->title = $request->title; $todo->desc = $request->desc; $todo->status = $request->status == 'on' ? 1 : 0; if ($todo->save()) { Log::info('Todo updated by user successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be updated caused by invalid todo data', ['user' => Auth::user()->id, 'todo' => $todo->id, 'data' => $request->except('password')]); return; // 422 } Log::error('Todo not found by user', ['user' => Auth::user()->id, 'todo' => $id]); return; // 401 } public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 } public function delete(Request $request, $id) { Log::warning('User is trying to delete a single todo', ['user' => Auth::user()->id, 'todo' => $id]); $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); if ($todo) { Log::info('User deleted a single todo successfully', ['user' => Auth::user()->id, 'todo' => $id]); $todo->delete(); return view('index'); } Log::error('Todo not found by user for deleting', ['user' => Auth::user()->id, 'todo' => $id]); return; // 404 } }

Dentro de cada uno de los métodos en TodoController , agregamos la fachada Log con un nivel de registro específico para definir el tipo de error que queremos enviar. A continuación se muestra un ejemplo del uso de la

Registrar fachada en el método de store .

 public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 }

Formateo de mensajes de registro

Suponga que no se siente cómodo con el LineFormatter predeterminado que usa Laravel, que hace un gran trabajo al proporcionar mensajes legibles y útiles.

En ese caso, puede activar fácilmente un objeto formateador personalizado para que se ajuste a su caso de uso y usarlo en toda la aplicación.

La documentación oficial de Monolog ofrece una lista completa de formateadores disponibles y puede crear fácilmente uno personalizado.

En Laravel, puede configurar fácilmente cualquiera de los controladores para usar su formateador personalizado agregándolo a la lista como se muestra a continuación dentro del archivo de configuración ubicado en config/logging.php :

 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, 'formatter' => MonologFormatterHtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Ym-d', ] ],

El ejemplo anterior agrega un MonologFormatterHtmlFormatter personalizado al controlador daily usando la tecla formatter y formatter_with en la configuración del canal daily para cambiar el formato de las fechas.

Envío de registros a diferentes canales

Con la ayuda de Monolog, Laravel puede enviar registros a diferentes canales y múltiples canales simultáneamente.

Demostremos cómo enviar registros a nuestro canal de Slack siguiendo estos sencillos pasos. Cambie el canal de registro predeterminado a Slack y agregue la URL del webhook de Slack en su archivo .env .

 LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

A continuación, pruebe su configuración registrando un mensaje en su aplicación utilizando la fachada de Log como la que se muestra a continuación:

 Log::debug("The API instance is on fire caused by:", ['user' => 1])

Puede abrir su canal de Slack para verificar el error impreso en el canal deseado que especificó al generar la URL del Webhook.

Resumen

El registro es tan importante como cualquier otro factor de su aplicación, si no más. Es por eso que el manifiesto de la aplicación Twelve-Factor la sugiere como una de las preocupaciones más críticas de cualquier aplicación moderna.

Con un registro efectivo, puede leer, ver y visualizar fácilmente los errores y defectos que ocurren en su aplicación lista para producción. Con ese fin, es importante que implemente el inicio de sesión estructurado en su aplicación desde el comienzo del proyecto.

En este artículo, hemos explorado el registro de Laravel y por qué debería usarlo en su próximo proyecto. Discutimos tanto el registro estructurado como el registro centralizado en detalle. Además, aprendimos a implementar el registro de Laravel mediante la creación de una aplicación Todo.

¿Cómo planea implementar el inicio de sesión en su próxima aplicación? Háganos saber en la sección de comentarios.