{"id":56739,"date":"2022-08-29T14:04:54","date_gmt":"2022-08-29T12:04:54","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=56739&#038;preview=true&#038;preview_id=56739"},"modified":"2023-08-23T14:43:49","modified_gmt":"2023-08-23T12:43:49","slug":"registro-en-laravel","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/","title":{"rendered":"Registro en Laravel: Todo lo que Necesitas Saber"},"content":{"rendered":"<p>Al desarrollar una aplicaci\u00f3n moderna, el registro debe estar en lo m\u00e1s alto de la lista de prioridades.<\/p>\n<p>El registro proporciona una forma de visualizar tu aplicaci\u00f3n tanto en desarrollo como en producci\u00f3n, permitiendo transparencia y visibilidad. Con un registro bien estructurado, las aplicaciones modernas pueden ser m\u00e1s f\u00e1ciles de mantener, ya que podemos identificar de forma proactiva los puntos de fallo y los cuellos de botella en el rendimiento de nuestra aplicaci\u00f3n.<\/p>\n<p>El framework Laravel viene con un robusto sistema de registro que maneja todos los obst\u00e1culos que implica la configuraci\u00f3n de un sistema de registro correctamente estructurado desde el principio. Este nuevo sistema de registro introducido en Laravel 6.5 es potente, y lo exploraremos en este art\u00edculo.<\/p>\n\n<p>Este art\u00edculo explorar\u00e1 los fundamentos del registro de Laravel y por qu\u00e9 deber\u00edas utilizar el registro de Laravel en tu pr\u00f3ximo proyecto. Hablaremos en detalle del registro estructurado y del registro centralizado. Adem\u00e1s, aprenderemos a implementar el registro de Laravel construyendo una aplicaci\u00f3n Todo.<\/p>\n<p>Sacar\u00e1s m\u00e1s provecho de este art\u00edculo si ya tienes:<\/p>\n<ul>\n<li>Buenos conocimientos de desarrollo web<\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-laravel\/\">Conocimiento b\u00e1sico de Laravel<\/a><\/li>\n<li>Construcci\u00f3n de aplicaciones con Laravel<\/li>\n<\/ul>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>\u00bfQu\u00e9 es el Registro de Laravel?<\/h2>\n<p>El registro de Laravel trata de c\u00f3mo Laravel gestiona el registro, o la notificaci\u00f3n autom\u00e1tica de problemas, utilizando un sistema de registro viral de PHP llamado Monolog. Sin embargo, debido a la filosof\u00eda de Laravel de utilizar librer\u00edas populares existentes para implementar diferentes caracter\u00edsticas del framework, Laravel emplea Monolog para todas sus necesidades de registro.<\/p>\n<p><a href=\"https:\/\/seldaek.github.io\/monolog\/\" target=\"_blank\" rel=\"noopener noreferrer\">Monolog<\/a> es una biblioteca de registro de PHP muy 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\u00e1ndar hasta servicios avanzados de gesti\u00f3n de registros de terceros. Laravel suele configurar Monolog para que utilice un archivo de configuraci\u00f3n de registro est\u00e1ndar.<\/p>\n<p>Para obtener m\u00e1s informaci\u00f3n sobre Monolog y sus caracter\u00edsticas, consulta la <a href=\"https:\/\/seldaek.github.io\/monolog\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentaci\u00f3n oficial<\/a>, ya que est\u00e1 fuera del alcance de este art\u00edculo.<\/p>\n<p>Antes de sumergirnos en la configuraci\u00f3n e implementaci\u00f3n del registro de Laravel mediante Monolog, vamos a explorar m\u00e1s razones para utilizar el registro de Laravel y los diferentes tipos.<\/p>\n<h2>\u00bfPor Qu\u00e9 Utilizar el Registro de Laravel?<\/h2>\n<p>\u00bfPor qu\u00e9 es necesario el registro?<\/p>\n<p>El manifiesto de <a href=\"https:\/\/12factor.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">las Apps de 12 Factores<\/a> trata el registro como una de las preocupaciones cr\u00edticas de una aplicaci\u00f3n moderna, ya que el registro es clave para el rendimiento y la monitorizaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/es\/docs\/alojamiento-wordpress\/resolucion-de-problemas-de-wordpress\/ver-registros-del-servidor\/\">Los registros<\/a> ayudan a comprender en detalle los errores que se producen en producci\u00f3n y d\u00f3nde se originan. Adem\u00e1s, con las estructuras de registro adecuadas, se puede mostrar el usuario concreto, la acci\u00f3n que caus\u00f3 el error y la posible soluci\u00f3n para una correcci\u00f3n y mantenimiento m\u00e1s r\u00e1pidos de los errores.<\/p>\n<p>El registro estructurado es un salvavidas en las aplicaciones de producci\u00f3n, ya que ayuda a localizar los defectos y a resolver los problemas en producci\u00f3n. Adem\u00e1s, puedes supervisar y recopilar todos tus mensajes de registro en tiempo real utilizando herramientas de registro especializadas para realizar an\u00e1lisis e informes en directo.<\/p>\n<p>Por estas razones, debes hacer del registro estructurado una prioridad en tu pr\u00f3ximo proyecto de aplicaci\u00f3n moderna.<\/p>\n<p>Veamos un resumen de los diferentes estilos de registro disponibles.<\/p>\n<h2>Fundamentos del Registro en Laravel<\/h2>\n<p>Aprender los fundamentos del registro te ayudar\u00e1 a entender c\u00f3mo maneja Laravel el registro y c\u00f3mo puedes mejorar tus pr\u00e1cticas de registro estructurado.<\/p>\n<p>Examinemos dos conceptos esenciales del registro para entender mejor c\u00f3mo implementar nuestros procedimientos de registro.<\/p>\n<h3>Registro Estructurado de Laravel<\/h3>\n<p>En el desarrollo de software, el registro estructurado consiste en implementar un formato de mensaje predeterminado y coherente para los registros de la aplicaci\u00f3n. Este formato permite tratar los mensajes como datos que pueden ser monitorizados, manipulados y visualizados mucho mejor que el formato de texto normal.<\/p>\n<p>Debes implementar un enfoque de registro estructurado en el desarrollo de tu aplicaci\u00f3n moderna, porque los archivos de registro son los activos esenciales para los desarrolladores cuando algo malo le ocurre a tu aplicaci\u00f3n en producci\u00f3n.<\/p>\n<p>Como Laravel utiliza Monolog, los desarrolladores pueden implementar r\u00e1pidamente el registro estructurado configurando el registrador para recibir tipos espec\u00edficos de informaci\u00f3n, almacenando los archivos de registro en diferentes formatos y enviando los registros a varios servicios de gesti\u00f3n de registros de terceros para su visualizaci\u00f3n.<\/p>\n<h3>Registro Centralizado de Laravel<\/h3>\n<p>Un sistema de registro centralizado es aquel en el que los registros se env\u00edan a soluciones de gesti\u00f3n centralizada de registros (CLM) desde m\u00faltiples fuentes para facilitar su consolidaci\u00f3n y visualizaci\u00f3n. Sin embargo, CLM es una soluci\u00f3n de registro especializada que recoge los mensajes de registro de diferentes fuentes y consolida los datos para facilitar su procesamiento y visualizaci\u00f3n.<\/p>\n<p>Adem\u00e1s de la recopilaci\u00f3n de datos, se espera que el CLM tambi\u00e9n apoye el an\u00e1lisis de los datos de registro y la presentaci\u00f3n clara de los datos despu\u00e9s del an\u00e1lisis.<\/p>\n<h3>Registro Estructurado Frente a Registro B\u00e1sico<\/h3>\n<p>Examinemos la diferencia entre el registro estructurado y el registro b\u00e1sico (no estructurado) y por qu\u00e9 deber\u00edas utilizar el registro estructurado en tu proyecto Laravel.<\/p>\n<h4>Registro B\u00e1sico<\/h4>\n<p>En el registro b\u00e1sico, los archivos de registro se almacenan en un formato crudo con datos limitados para consultar e identificar registros individuales.<\/p>\n<p>Al utilizar el registro b\u00e1sico, <a href=\"https:\/\/kinsta.com\/es\/\">los desarrolladores<\/a> no podr\u00e1n utilizar herramientas anal\u00edticas de terceros para leer, ver y analizar los registros, a menos que desarrollen una herramienta personalizada o se queden con una herramienta limitada que soporte su formato de registro.<\/p>\n<p>Hay tres grandes razones para evitar el uso del registro b\u00e1sico:<\/p>\n<ol>\n<li>Los sistemas centralizados de gesti\u00f3n de registros no pueden trabajar con los datos sin apoyo adicional.<\/li>\n<li>Se necesita una soluci\u00f3n personalizada para leer y analizar los datos de una soluci\u00f3n de registro b\u00e1sica.<\/li>\n<li>Puede ser un reto para los administradores leer los datos de registro b\u00e1sicos, ya que son crudos y no est\u00e1n estructurados.<\/li>\n<\/ol>\n<h4>Registro Estructurado<\/h4>\n<p>El registro estructurado ahorra tiempo a los desarrolladores al utilizar herramientas anal\u00edticas de registro de terceros de c\u00f3digo abierto que admiten la estructura de registro est\u00e1ndar para leer, ver y analizar los registros.<\/p>\n<p>Los registros son \u00fatiles si contienen los datos correctos que se indican a continuaci\u00f3n, que es lo que pretende el registro estructurado. Podemos utilizar los datos incluidos en el registro estructurado para crear cuadros de mando, gr\u00e1ficos, diagramas y cualquier otra visualizaci\u00f3n \u00fatil para determinar la salud de la aplicaci\u00f3n.<\/p>\n<p>Estos son ejemplos b\u00e1sicos de la informaci\u00f3n que podemos incluir en los mensajes de registro estructurado. Adem\u00e1s, puedes personalizar completamente los datos para adaptarlos a tus necesidades.<\/p>\n<p>Estos son algunos ejemplos de los datos que puedes recoger con el registro estructurado:<\/p>\n<ol>\n<li>El puerto utilizado para ejecutar la funci\u00f3n<\/li>\n<li>La fecha y hora en que se produjo el evento<\/li>\n<li>El nombre de usuario o ID del cliente<\/li>\n<li>Una descripci\u00f3n del evento (mensaje de registro)<\/li>\n<li>El protocolo utilizado para ejecutar la funci\u00f3n<\/li>\n<li>La ubicaci\u00f3n del evento desencadenado (indica la API o la aplicaci\u00f3n en ejecuci\u00f3n)<\/li>\n<li>El identificador \u00fanico del evento<\/li>\n<li>El tipo de acci\u00f3n desencadenada (nivel de registro)<\/li>\n<\/ol>\n<p>Los registros deben contener suficientes datos para visualizar f\u00e1cilmente la soluci\u00f3n o el motivo del evento de registro. Adem\u00e1s, ten en cuenta que no debes almacenar en los registros todo tipo de informaci\u00f3n, como contrase\u00f1as o datos sensibles.<\/p>\n<p>Ahora que hemos vislumbrado en qu\u00e9 consiste el registro de Laravel, pasemos a implementar el registro de Laravel construyendo una aplicaci\u00f3n con el registro como ciudadano de primera clase.<\/p>\n<h2>\u00bfC\u00f3mo Implementar el Registro de Laravel con Todo App?<\/h2>\n<p>Ahora vamos a aplicar lo que hemos aprendido hasta ahora creando un nuevo proyecto Laravel e implementando el registro Laravel.<\/p>\n<p>Si no has usado Laravel antes, puedes leer \u00bf<a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-laravel\/\">qu\u00e9 es Laravel<\/a>? o echar un vistazo a nuestra lista de <a href=\"https:\/\/kinsta.com\/es\/blog\/tutoriales-laravel\/\">excelentes tutoriales de Laravel<\/a> para empezar.<\/p>\n<h3>Configurar Laravel<\/h3>\n<p>En primer lugar, vamos a crear una nueva instancia de Laravel utilizando el siguiente comando. Puedes consultar la <a href=\"https:\/\/laravel.com\/docs\/8.x\/installation\" target=\"_blank\" rel=\"noopener noreferrer\">documentaci\u00f3n oficial<\/a> para saber m\u00e1s.<\/p>\n<p>Abre tu consola y navega hasta el lugar donde guardas tus proyectos PHP antes de ejecutar los comandos siguientes. Aseg\u00farate de tener instalado y configurado correctamente <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Composer<\/a>.<\/p>\n<pre><code class=\"language-json\">composer create-project laravel\/laravel laravel-logging-app\ncd laravel-logging-app \/\/ Change directory to current Laravel installation\nphp artisan serve \/\/ Start Laravel development server<\/code><\/pre>\n<h3>Configurar y Sembrar la Base de Datos<\/h3>\n<p>A continuaci\u00f3n, configuraremos nuestra base de datos, crearemos un nuevo modelo <code>Todo<\/code> y sembraremos 200 datos falsos para las pruebas.<\/p>\n<p>Abre tu cliente de base de datos y crea una nueva base de datos. Haremos lo mismo con el nombre <code>laravel_logging_app_db<\/code> y luego rellenaremos nuestro archivo <strong>.env<\/strong> con las credenciales de la base de datos:<\/p>\n<pre><code class=\"language-bash\">DB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=laravel_logging_app_db\nDB_USERNAME=\/\/DB USERNAME HERE\nDB_PASSWORD=\/\/DB PASSWORD HERE<\/code><\/pre>\n<p>A continuaci\u00f3n, ejecutaremos el siguiente comando para crear la migraci\u00f3n y el modelo <code>Todo<\/code> simult\u00e1neamente:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Todo -mc<\/code><\/pre>\n<p>Abre la migraci\u00f3n reci\u00e9n creada encontrada <strong>database\/migrations\/xxx-create-todos-xxx.php<\/strong> y pega los siguientes c\u00f3digos:<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse IlluminateSupportFacadesSchema;\nuse IlluminateDatabaseSchemaBlueprint;\nuse IlluminateDatabaseMigrationsMigration;\nclass CreateTodosTable extends Migration\n{\n  \/**\n  * Run the migrations.\n  *\n  * @return void\n  *\/\n  public function up()\n  {\n    Schema::create('todos', function (Blueprint $table) {\n      $table-&gt;id();\n      $table-&gt;string('title');\n      $table-&gt;text('description')-&gt;nullable();\n      $table-&gt;boolean('is_completed')-&gt;default(false);\n      $table-&gt;timestamps();\n    });\n  }\n  \/**\n  * Reverse the migrations.\n  *\n  * @return void\n  *\/\n  public function down()\n  {\n    Schema::dropIfExists('todos');\n  }\n}<\/code><\/pre>\n<p>Puedes sembrar tus todos con datos de Faker aprendiendo <a href=\"https:\/\/laravel.com\/docs\/8.x\/seeding\" target=\"_blank\" rel=\"noopener noreferrer\">a sembrar tus bases de datos<\/a> en Laravel utilizando Faker.<\/p>\n<h3>Visi\u00f3n General de Monolog<\/h3>\n<p>Con Laravel Monolog, puedes transmitir y enviar registros estructurados a diferentes canales como correos electr\u00f3nicos, Slack, archivos, sockets, bandejas de entrada, bases de datos y varios servicios web. En Laravel, puedes configurar el registro desde un \u00fanico archivo de configuraci\u00f3n situado en <strong>config\/logging.php<\/strong>.<\/p>\n<p>El archivo de configuraci\u00f3n viene con controladores de registro predefinidos para elegir, y el controlador por defecto es un <code>stack<\/code> que utiliza el canal <code>single<\/code> para registrar en un archivo <strong>laravel.log<\/strong> que se encuentra en la carpeta <strong>storage\/logs<\/strong>. Vamos a demostrar el registro estructurado utilizando un par de controladores de registro de <a href=\"https:\/\/laravel.com\/docs\/8.x\/logging#available-channel-drivers\" target=\"_blank\" rel=\"noopener noreferrer\">Laravel<\/a>.<\/p>\n<p>Laravel proporciona un <a href=\"https:\/\/laravel.com\/docs\/8.x\/logging#writing-log-messages\" target=\"_blank\" rel=\"noopener noreferrer\">pu\u00f1ado de m\u00e9todos<\/a> para interactuar con los logs, como se demuestra en general en el archivo controlador <strong>TodosController.<\/strong> php en breve.<\/p>\n<h3>Escribir Mensajes de Registro en el Controlador<\/h3>\n<p>Abre el archivo controlador <strong>TodosController.php<\/strong> reci\u00e9n creado que se encuentra en la carpeta <strong>app\/Http\/Controllers<\/strong> y pega los siguientes c\u00f3digos:<\/p>\n<pre><code class=\"language-php\">\n&lt;?php\nnamespace AppHttpControllers;\nuse AppModelsTodo;\nuse IlluminateHttpRequest;\nuse AppHttpControllersController;\nuse IlluminateSupportFacadesAuth;\nuse IlluminateSupportFacadesLog;\nclass TodosController extends Controller\n{\n  public function index(Request $request)\n  {\n    $todos = Todo::all();\n    Log::warning('User is accessing all the Todos', ['user' =&gt; Auth::user()-&gt;id]);\n    return view('dashboard')-&gt;with(['todos' =&gt; $todos]);\n  }\n  public function byUserId(Request $request)\n  {\n    $todos = Todo::where('user_id', Auth::user()-&gt;id)-&gt;get();\n    Log::info('User is accessing all his todos', ['user' =&gt; Auth::user()-&gt;id]);\n    return view('dashboard')-&gt;with(['todos' =&gt; $todos]);\n  }\n  public function show(Request $request, $id)\n  {\n    $todo = Todo::find($id);\n    Log::info('User is accessing a single todo', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n    return view('show')-&gt;with(['todo' =&gt; $todo]);\n  }\n  public function update(Request $request, $id)\n  {\n    # Validations before updating\n    $todo = Todo::where('user_id', Auth::user()-&gt;id)-&gt;where('id', $id)-&gt;first();\n    Log::warning('Todo found for updating by user', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo]);\n    if ($todo) {\n      $todo-&gt;title = $request-&gt;title;\n      $todo-&gt;desc = $request-&gt;desc;\n      $todo-&gt;status = $request-&gt;status == 'on' ? 1 : 0;\n      if ($todo-&gt;save()) {\n        Log::info('Todo updated by user successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n        return view('show', ['todo' =&gt; $todo]);\n      }\n      Log::warning('Todo could not be updated caused by invalid todo data', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n      return; \/\/ 422\n    }\n    Log::error('Todo not found by user', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n    return; \/\/ 401\n  }\n  public function store(Request $request)\n  {\n    Log::warning('User is trying to create a single todo', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n    # Validations before updating\n    $todo = new Todo;\n    $todo-&gt;title = $request-&gt;title;\n    $todo-&gt;desc = $request-&gt;desc;\n    $todo-&gt;user_id = Auth::user()-&gt;id;\n    if ($todo-&gt;save()) {\n      Log::info('User create a single todo successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n      return view('show', ['todo' =&gt; $todo]);\n    }\n    Log::warning('Todo could not be created caused by invalid todo data', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n    return; \/\/ 422\n  }\n  public function delete(Request $request, $id)\n  {\n    Log::warning('User is trying to delete a single todo', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n    $todo = Todo::where('user_id', Auth::user()-&gt;id)-&gt;where('id', $id)-&gt;first();\n    if ($todo) {\n      Log::info('User deleted a single todo successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n      $todo-&gt;delete();\n      return view('index');\n    }\n    Log::error('Todo not found by user for deleting', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n    return; \/\/ 404\n  }\n}<\/code><\/pre>\n<p>Dentro de cada uno de los m\u00e9todos del <code>TodoController<\/code>, a\u00f1adimos la fachada <code>Log<\/code> con un nivel de registro espec\u00edfico para definir el tipo de error que queremos enviar. A continuaci\u00f3n se muestra un ejemplo de uso del<\/p>\n<p>Fachada de registro en el m\u00e9todo <code>store<\/code>.<\/p>\n<pre><code class=\"language-php\">public function store(Request $request)\n{\n  Log::warning('User is trying to create a single todo', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n  # Validations before updating\n  $todo = new Todo;\n  $todo-&gt;title = $request-&gt;title;\n  $todo-&gt;desc = $request-&gt;desc;\n  $todo-&gt;user_id = Auth::user()-&gt;id;\n  if ($todo-&gt;save()) {\n    Log::info('User create a single todo successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n    return view('show', ['todo' =&gt; $todo]);\n  }\n  Log::warning('Todo could not be created caused by invalid todo data', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n  return; \/\/ 422\n}<\/code><\/pre>\n<h3>Formatear los Mensajes de Registro<\/h3>\n<p>Sup\u00f3n que no te sientes c\u00f3modo con el <code>LineFormatter<\/code> por defecto utilizado por Laravel, que hace un gran trabajo para proporcionar mensajes legibles y \u00fatiles.<\/p>\n<p>En ese caso, puedes crear f\u00e1cilmente un objeto formateador personalizado que se adapte a tu caso de uso y utilizarlo en toda la aplicaci\u00f3n.<\/p>\n<p>La documentaci\u00f3n oficial de Monolog ofrece una lista completa de los <a href=\"https:\/\/github.com\/Seldaek\/monolog\/blob\/main\/doc\/02-handlers-formatters-processors.md#formatters\" target=\"_blank\" rel=\"noopener noreferrer\">formateadores disponibles<\/a> y puedes crear f\u00e1cilmente uno personalizado.<\/p>\n<p>En Laravel, puedes configurar f\u00e1cilmente cualquiera de los controladores para que utilicen tu formateador personalizado a\u00f1adi\u00e9ndolo a la lista como se indica a continuaci\u00f3n dentro del archivo de configuraci\u00f3n situado en <strong>config\/logging.php<\/strong>:<\/p>\n<pre><code class=\"language-php\">'daily' =&gt; [\n  'driver' =&gt; 'daily',\n  'path' =&gt; storage_path('logs\/laravel.log'),\n  'level' =&gt; env('LOG_LEVEL', 'debug'),\n  'days' =&gt; 14,\n  'formatter' =&gt; MonologFormatterHtmlFormatter::class,\n  'formatter_with' =&gt; [\n    'dateFormat' =&gt; 'Y-m-d',\n  ]\n],<\/code><\/pre>\n<p>El ejemplo anterior a\u00f1ade un <code>MonologFormatterHtmlFormatter<\/code> personalizado al controlador <code>daily<\/code> utilizando la clave <code>formatter<\/code> y <code>formatter_with<\/code> en la configuraci\u00f3n del canal <code>daily<\/code> para cambiar el formato de las fechas.<\/p>\n<h3>Env\u00edo de Registros a Diferentes Canales<\/h3>\n<p>Con la ayuda de Monolog, Laravel puede enviar registros a diferentes canales y a varios canales simult\u00e1neamente.<\/p>\n<p>Vamos a demostrar c\u00f3mo enviar registros a nuestro canal de Slack siguiendo estos sencillos pasos. Cambia el canal de registro por defecto a Slack y a\u00f1ade la URL de <a href=\"https:\/\/api.slack.com\/messaging\/webhooks\" target=\"_blank\" rel=\"noopener noreferrer\">Slack Webhook<\/a> en tu archivo <strong>.env<\/strong>.<\/p>\n<pre><code class=\"markdown\">LOG_CHANNEL=slack\nLOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here<\/code><\/pre>\n<p>A continuaci\u00f3n, prueba tu configuraci\u00f3n registrando un mensaje en tu aplicaci\u00f3n utilizando la fachada <code>Log<\/code> como la que se muestra a continuaci\u00f3n:<\/p>\n<pre><code class=\"markdown\">Log::debug(\"The API instance is on fire caused by:\", ['user' =&gt; 1])<\/code><\/pre>\n<p>Puedes abrir tu canal de Slack para comprobar el error impreso en el canal deseado que hayas especificado al generar la URL del Webhook.<\/p>\n<h2>Resumen<\/h2>\n<p>El registro es tan importante como cualquier otro factor de tu aplicaci\u00f3n, si no m\u00e1s. Por eso se sugiere en el manifiesto de los Doce Factores de la App como una de las preocupaciones m\u00e1s cr\u00edticas de cualquier aplicaci\u00f3n moderna.<\/p>\n<p>Con un registro eficaz, puedes leer, ver y visualizar f\u00e1cilmente los errores y defectos que se produzcan en tu aplicaci\u00f3n lista para la producci\u00f3n. Para ello, es importante que implementes un registro estructurado en tu aplicaci\u00f3n desde el inicio del proyecto.<\/p>\n\n<p>En este art\u00edculo, hemos explorado el registro de Laravel y por qu\u00e9 deber\u00edas utilizarlo en tu pr\u00f3ximo proyecto. Hemos hablado en detalle del registro estructurado y del registro centralizado. Adem\u00e1s, hemos aprendido a implementar el registro de Laravel construyendo una aplicaci\u00f3n Todo.<\/p>\n<p>\u00bfC\u00f3mo piensas implementar el registro en tu pr\u00f3xima aplicaci\u00f3n? H\u00e1znoslo saber en la secci\u00f3n de comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Al desarrollar una aplicaci\u00f3n moderna, el registro debe estar en lo m\u00e1s alto de la lista de prioridades. El registro proporciona una forma de visualizar tu &#8230;<\/p>\n","protected":false},"author":193,"featured_media":56740,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[766,1101,624,407,432],"topic":[1315],"class_list":["post-56739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-laravel","tag-logging","tag-monitoring","tag-performance","tag-php","topic-frameworks-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Registro en Laravel: Todo lo que Necesitas Saber<\/title>\n<meta name=\"description\" content=\"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Registro en Laravel: Todo lo que Necesitas Saber\" \/>\n<meta property=\"og:description\" content=\"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-29T12:04:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-23T12:43:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Solomon Eseme\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kaperskyguru\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Solomon Eseme\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\"},\"author\":{\"name\":\"Solomon Eseme\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\"},\"headline\":\"Registro en Laravel: Todo lo que Necesitas Saber\",\"datePublished\":\"2022-08-29T12:04:54+00:00\",\"dateModified\":\"2023-08-23T12:43:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\"},\"wordCount\":2285,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png\",\"keywords\":[\"laravel\",\"logging\",\"monitoring\",\"performance\",\"php\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\",\"name\":\"Registro en Laravel: Todo lo que Necesitas Saber\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png\",\"datePublished\":\"2022-08-29T12:04:54+00:00\",\"dateModified\":\"2023-08-23T12:43:49+00:00\",\"description\":\"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frameworks PHP\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/frameworks-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Registro en Laravel: Todo lo que Necesitas Saber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\",\"name\":\"Solomon Eseme\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g\",\"caption\":\"Solomon Eseme\"},\"description\":\"I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me\",\"sameAs\":[\"https:\/\/masteringbackend.com\",\"https:\/\/linkedin.com\/in\/solomoneseme\",\"https:\/\/x.com\/kaperskyguru\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/solomoneseme\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Registro en Laravel: Todo lo que Necesitas Saber","description":"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/","og_locale":"es_ES","og_type":"article","og_title":"Registro en Laravel: Todo lo que Necesitas Saber","og_description":"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.","og_url":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2022-08-29T12:04:54+00:00","article_modified_time":"2023-08-23T12:43:49+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png","type":"image\/png"}],"author":"Solomon Eseme","twitter_card":"summary_large_image","twitter_description":"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png","twitter_creator":"@kaperskyguru","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Solomon Eseme","Tiempo de lectura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/"},"author":{"name":"Solomon Eseme","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2"},"headline":"Registro en Laravel: Todo lo que Necesitas Saber","datePublished":"2022-08-29T12:04:54+00:00","dateModified":"2023-08-23T12:43:49+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/"},"wordCount":2285,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png","keywords":["laravel","logging","monitoring","performance","php"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/","url":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/","name":"Registro en Laravel: Todo lo que Necesitas Saber","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png","datePublished":"2022-08-29T12:04:54+00:00","dateModified":"2023-08-23T12:43:49+00:00","description":"El registro es vital para controlar la salud y la eficacia de tus proyectos de desarrollo. Aprende a aplicar el registro estructurado en Laravel.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/08\/laravel-logging.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/registro-en-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Frameworks PHP","item":"https:\/\/kinsta.com\/es\/secciones\/frameworks-php\/"},{"@type":"ListItem","position":3,"name":"Registro en Laravel: Todo lo que Necesitas Saber"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2","name":"Solomon Eseme","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g","caption":"Solomon Eseme"},"description":"I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me","sameAs":["https:\/\/masteringbackend.com","https:\/\/linkedin.com\/in\/solomoneseme","https:\/\/x.com\/kaperskyguru"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/solomoneseme\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/56739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=56739"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/56739\/revisions"}],"predecessor-version":[{"id":60440,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/56739\/revisions\/60440"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/en"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/jp"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/es"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/translations\/se"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/56739\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/56740"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=56739"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=56739"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=56739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}