{"id":52371,"date":"2022-08-29T09:06:02","date_gmt":"2022-08-29T12:06:02","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=52371&#038;preview=true&#038;preview_id=52371"},"modified":"2023-08-22T04:44:23","modified_gmt":"2023-08-22T07:44:23","slug":"laravel-logging","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/","title":{"rendered":"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber"},"content":{"rendered":"<p>Ao desenvolver um aplicativo moderno, o registro deve estar no topo da lista de prioridades.<\/p>\n<p>O registro fornece uma maneira de visualizar seu aplicativo tanto no desenvolvimento quanto na produ\u00e7\u00e3o, permitindo transpar\u00eancia e visibilidade. Com o registro corretamente estruturado, aplicativos modernos podem se tornar mais f\u00e1ceis de manter, pois podemos identificar proativamente pontos de falha e gargalos de desempenho em nosso aplicativo.<\/p>\n<p>A Framework Laravel vem com um robusto sistema de registro que lida com todos os obst\u00e1culos envolvidos na configura\u00e7\u00e3o de um sistema de registro devidamente estruturado fora da caixa. Este novo sistema de explora\u00e7\u00e3o do registro introduzido no Laravel 6.5 \u00e9 poderoso e n\u00f3s o exploraremos neste artigo.<\/p>\n\n<p>Este artigo ir\u00e1 explorar os fundamentos dos registros no Laravel e por que voc\u00ea deve usar o registro de Laravel em seu pr\u00f3ximo projeto. Discutiremos em detalhes o registro estruturado e o registro centralizado. Al\u00e9m disso, aprenderemos como implementar o registro Laravel atrav\u00e9s da constru\u00e7\u00e3o de um aplicativo Todo.<\/p>\n<p>Voc\u00ea obter\u00e1 mais deste artigo se voc\u00ea j\u00e1 tiver o seguinte sob seu cinto:<\/p>\n<ul>\n<li>Bons conhecimentos de desenvolvimento web<\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-laravel\/\">Entendimento b\u00e1sico do Laravel<\/a><\/li>\n<li>Construindo aplicativos com 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>O que \u00e9 registro Laravel?<\/h2>\n<p>O registro Laravel \u00e9 tudo sobre como Laravel lida com o registro, ou relat\u00f3rio autom\u00e1tico de problemas, usando um sistema de registro PHP viral chamado Monolog. Entretanto, devido \u00e0 filosofia de Laravel de usar bibliotecas populares existentes para implementar diferentes caracter\u00edsticas de framework, Laravel emprega Monolog para todas as suas necessidades de registro.<\/p>\n<p><a href=\"https:\/\/seldaek.github.io\/monolog\/\" target=\"_blank\" rel=\"noopener noreferrer\">Monolog<\/a> \u00e9 uma biblioteca de registros PHP altamente flex\u00edvel e popular que podemos configurar para enviar seus registros para arquivos, soquetes, bancos de dados e outros servi\u00e7os web. Monolog fornece uma interface familiar para escrever registros de arquivos de texto padr\u00e3o para servi\u00e7os avan\u00e7ados de gerenciamento de registros de terceiros. Laravel tipicamente configura Monolog para usar um arquivo de configura\u00e7\u00e3o de registro padr\u00e3o.<\/p>\n<p>Para mais informa\u00e7\u00f5es sobre Monolog e suas funcionalidades, confira a <a href=\"https:\/\/seldaek.github.io\/monolog\/\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o oficial<\/a>, pois isso est\u00e1 al\u00e9m do escopo deste artigo.<\/p>\n<p>Antes de mergulharmos na configura\u00e7\u00e3o e implementa\u00e7\u00e3o do registro Laravel usando Monolog, vamos explorar mais raz\u00f5es para usar o registro Laravel e os diferentes tipos.<\/p>\n<h2>Por que usar o registro Laravel?<\/h2>\n<p>Por que \u00e9 necess\u00e1rio o registro de dados?<\/p>\n<p>O Manifesto dos <a href=\"https:\/\/12factor.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">Aplicativos de 12 Fatores<\/a> trata a explora\u00e7\u00e3o do registro como uma das preocupa\u00e7\u00f5es cr\u00edticas de um aplicativo moderno, j\u00e1 que a explora\u00e7\u00e3o do registro \u00e9 a chave para o desempenho e monitoramento.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/solucao-de-problemas-wordpress\/visualizar-registros-do-servidor\/\">Os registros<\/a> ajudam na compreens\u00e3o detalhada dos erros que acontecem na produ\u00e7\u00e3o e de onde eles se originaram. Al\u00e9m disso, com estruturas de registros adequadas, ele pode mostrar o usu\u00e1rio em particular, a a\u00e7\u00e3o que causou o erro e a solu\u00e7\u00e3o poss\u00edvel para a corre\u00e7\u00e3o e manuten\u00e7\u00e3o mais r\u00e1pida do bug.<\/p>\n<p>O registro estruturado \u00e9 um salva-vidas em aplicativos de produ\u00e7\u00e3o, ajudando a solucionar defeitos e resolver problemas na produ\u00e7\u00e3o. Al\u00e9m disso, voc\u00ea pode monitorar e coletar todas as suas mensagens de registro em tempo real usando ferramentas especializadas de registro para an\u00e1lise e relat\u00f3rios ao vivo.<\/p>\n<p>Por estas raz\u00f5es, voc\u00ea precisa fazer do registro estruturado uma prioridade m\u00e1xima em seu pr\u00f3ximo projeto de aplicativo moderno.<\/p>\n<p>Vamos dar uma olhada na vis\u00e3o geral dos diferentes estilos de extra\u00e7\u00e3o dispon\u00edveis.<\/p>\n<h2>No\u00e7\u00f5es b\u00e1sicas de registros no Laravel<\/h2>\n<p>Aprender o b\u00e1sico da explora\u00e7\u00e3o do registro o ajudar\u00e1 a entender como Laravel lida com a explora\u00e7\u00e3o do registro e como voc\u00ea pode melhorar suas pr\u00e1ticas estruturadas de explora\u00e7\u00e3o do registro.<\/p>\n<p>Vamos examinar dois conceitos essenciais na explora\u00e7\u00e3o do registro para entender melhor como implementar nossos procedimentos de explora\u00e7\u00e3o do registro.<\/p>\n<h3>Registro estruturado do Laravel<\/h3>\n<p>No desenvolvimento de software, o registro estruturado est\u00e1 implementando um formato de mensagem pr\u00e9-determinado e consistente para os registros de aplicativo. Este formato permite que as mensagens sejam tratadas como dados que podem ser monitorados, manipulados e visualizados muito melhor do que o formato de texto regular.<\/p>\n<p>Voc\u00ea deve implementar uma abordagem de registro estruturado no desenvolvimento do seu aplicativo moderno porque os arquivos de registro s\u00e3o os ativos essenciais para os desenvolvedores quando algo errado acontece com o seu aplicativo em produ\u00e7\u00e3o.<\/p>\n<p>Como Laravel usa o Monolog, os desenvolvedores podem rapidamente implementar registros estruturados configurando o logger para receber tipos espec\u00edficos de informa\u00e7\u00f5es, armazenando os arquivos de registro em diferentes formatos e enviando os registros para v\u00e1rios servi\u00e7os de gerenciamento de registros de terceiros para visualiza\u00e7\u00e3o.<\/p>\n<h3>Registro centralizado no Laravel<\/h3>\n<p>Um sistema de registro centralizado \u00e9 onde os registros s\u00e3o enviados para solu\u00e7\u00f5es de Gerenciamento Centralizado de registro (CLM) a partir de m\u00faltiplas fontes para f\u00e1cil consolida\u00e7\u00e3o e visualiza\u00e7\u00e3o. Entretanto, o CLM \u00e9 uma solu\u00e7\u00e3o de logger especializada que coleta mensagens de registro de diferentes fontes e consolida os dados para facilitar o processamento e a visualiza\u00e7\u00e3o.<\/p>\n<p>Al\u00e9m da coleta de dados, espera-se que o CLM tamb\u00e9m suporte a an\u00e1lise dos dados de registro e a apresenta\u00e7\u00e3o clara dos dados ap\u00f3s a an\u00e1lise.<\/p>\n<h3>Registros estruturados vs Registros b\u00e1sicos<\/h3>\n<p>Vamos examinar a diferen\u00e7a entre o registro estruturado e o registro b\u00e1sico (n\u00e3o estruturado) e porque voc\u00ea deve usar o registro estruturado em seu projeto Laravel.<\/p>\n<h4>Registro b\u00e1sico<\/h4>\n<p>No registro b\u00e1sico, os arquivos de registro s\u00e3o armazenados em um formato bruto com dados limitados para consulta e identifica\u00e7\u00e3o de registros individuais.<\/p>\n<p>Ao usar o registro b\u00e1sico, os <a href=\"https:\/\/kinsta.com\/pt\/\">desenvolvedores<\/a> n\u00e3o ser\u00e3o capazes de usar ferramentas anal\u00edticas de terceiros para ler, visualizar e analisar os registros, a menos que eles desenvolvam uma ferramenta customizada ou que se fixem com uma ferramenta limitada que suporte seu formato de registros.<\/p>\n<p>H\u00e1 tr\u00eas grandes raz\u00f5es para evitar o uso do corte b\u00e1sico:<\/p>\n<ol>\n<li>Sistemas centralizados de gerenciamento de registros n\u00e3o podem funcionar com os dados sem suporte adicional.<\/li>\n<li>Uma solu\u00e7\u00e3o personalizada \u00e9 necess\u00e1ria para ler e analisar os dados de uma solu\u00e7\u00e3o b\u00e1sica de registro.<\/li>\n<li>Pode ser um desafio para os administradores ler os dados b\u00e1sicos de registro, uma vez que eles s\u00e3o brutos e n\u00e3o estruturados.<\/li>\n<\/ol>\n<h4>Registro estruturado<\/h4>\n<p>O registro estruturado economiza tempo dos desenvolvedores ao usar ferramentas anal\u00edticas de registro de terceiros de c\u00f3digo aberto que suportam a estrutura padr\u00e3o de registro para ler, visualizar e analisar os registros.<\/p>\n<p>Os registros s\u00e3o \u00fateis se eles contiverem os dados corretos listados abaixo, que \u00e9 o que o registro estruturado visa alcan\u00e7ar. N\u00f3s podemos usar os dados inclu\u00eddos no registro estruturado para criar pain\u00e9is, gr\u00e1ficos, gr\u00e1ficos e qualquer outra visualiza\u00e7\u00e3o \u00fatil para determinar a sa\u00fade do aplicativo.<\/p>\n<p>Estes s\u00e3o exemplos b\u00e1sicos das informa\u00e7\u00f5es que podemos incluir em mensagens de registro estruturadas. Al\u00e9m disso, voc\u00ea pode personalizar completamente os dados para atender \u00e0s suas necessidades.<\/p>\n<p>Aqui est\u00e3o alguns exemplos dos dados que voc\u00ea pode coletar com o registro estruturado:<\/p>\n<ol>\n<li>A porta usada para executar a fun\u00e7\u00e3o<\/li>\n<li>A data e a hora em que o evento aconteceu<\/li>\n<li>O nome de usu\u00e1rio ou ID do cliente<\/li>\n<li>Uma descri\u00e7\u00e3o do evento (mensagem de registro)<\/li>\n<li>O protocolo usado para executar a fun\u00e7\u00e3o<\/li>\n<li>A localiza\u00e7\u00e3o do evento acionado (indicar API ou aplicativo em execu\u00e7\u00e3o)<\/li>\n<li>O ID \u00fanico do evento<\/li>\n<li>O tipo de a\u00e7\u00e3o acionada (n\u00edvel de log)<\/li>\n<\/ol>\n<p>Os registros devem conter dados suficientes para visualizar facilmente a solu\u00e7\u00e3o ou a raz\u00e3o do evento de log. Observe tamb\u00e9m que voc\u00ea n\u00e3o deve armazenar todos os tipos de informa\u00e7\u00f5es, tais como senhas ou dados sens\u00edveis nos registros.<\/p>\n<p>Agora que vislumbramos o que \u00e9 a explora\u00e7\u00e3o do registro Laravel, vamos passar \u00e0 implementa\u00e7\u00e3o da explora\u00e7\u00e3o do registro Laravel, construindo um aplicativo com explora\u00e7\u00e3o do registro como um cidad\u00e3o de primeira classe.<\/p>\n<h2>Como implementar o registro Laravel com o aplicativo Todo<\/h2>\n<p>Agora n\u00f3s vamos aplicar o que aprendemos at\u00e9 agora, criando um novo projeto Laravel e implementando o registro Laravel.<\/p>\n<p>Se voc\u00ea nunca usou Laravel antes, voc\u00ea pode ler <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-laravel\/\">o que Laravel \u00e9<\/a> ou espreitar nossa lista de <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutoriais-laravel\/\">excelentes tutoriais de Laravel<\/a> para come\u00e7ar.<\/p>\n<h3>Configurando o Laravel<\/h3>\n<p>Primeiro, vamos criar uma nova inst\u00e2ncia de Laravel usando o comando abaixo. Voc\u00ea pode consultar a <a href=\"https:\/\/laravel.com\/docs\/8.x\/installation\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o oficial<\/a> para mais informa\u00e7\u00f5es.<\/p>\n<p>Abra seu console e navegue at\u00e9 onde voc\u00ea armazena seus projetos PHP antes de executar os comandos abaixo. Certifique-se de ter o <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Composer<\/a> instalado e configurado corretamente.<\/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>Configurando e alimentando o banco de dados<\/h3>\n<p>Em seguida, vamos montar nosso banco de dados, criar um novo modelo <code>Todo<\/code>, e alimentar 200 dados falsos para testes.<\/p>\n<p>Abra seu cliente de banco de dados e crie um novo banco de dados. Faremos o mesmo com o nome <code>laravel_logging_app_db<\/code> e ent\u00e3o preencheremos nosso arquivo <strong>.env<\/strong> com as credenciais do banco de dados:<\/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>Em seguida, executaremos o seguinte comando para criar a migra\u00e7\u00e3o e o modelo <code>Todo<\/code> simultaneamente:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Todo -mc<\/code><\/pre>\n<p>Abra o <strong>database\/migrations\/xxx-create-todos-xxx.php<\/strong>\u00a0e cole nos seguintes 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>Voc\u00ea pode alimentar seus todos com dados falsos aprendendo <a href=\"https:\/\/laravel.com\/docs\/8.x\/seeding\" target=\"_blank\" rel=\"noopener noreferrer\">a alimentar seus bancos de dados<\/a> em Laravel usando o Faker.<\/p>\n<h3>Vis\u00e3o geral do Monolog<\/h3>\n<p>Com Laravel Monolog, voc\u00ea pode transmitir e enviar registros estruturados para diferentes canais, como e-mails, Slack, arquivos, soquetes, caixas de entrada, bancos de dados e v\u00e1rios servi\u00e7os web. No Laravel, voc\u00ea pode configurar o registro a partir de um \u00fanico arquivo de configura\u00e7\u00e3o localizado em <strong>config\/logging.php<\/strong>.<\/p>\n<p>O arquivo de configura\u00e7\u00e3o vem com drivers de registro pr\u00e9-definidos para escolher, e o driver padr\u00e3o \u00e9 um <code>stack<\/code> que usa o canal <code>single<\/code> para logar em um arquivo <strong>laravel.log<\/strong> encontrado na pasta <strong>storage\/logs<\/strong>. N\u00f3s demonstraremos o registro estruturado usando um par de <a href=\"https:\/\/laravel.com\/docs\/8.x\/logging#available-channel-drivers\" target=\"_blank\" rel=\"noopener noreferrer\">drivers de registro Laravel<\/a>.<\/p>\n<p>Laravel fornece um <a href=\"https:\/\/laravel.com\/docs\/8.x\/logging#writing-log-messages\" target=\"_blank\" rel=\"noopener noreferrer\">punhado de m\u00e9todos<\/a> para interagir com os registros, como demonstrado em geral no arquivo do controlador <strong>TodosController.php<\/strong> em breve.<\/p>\n<h3>Escrevendo mensagens de registro no controlador<\/h3>\n<p>Abra o arquivo rec\u00e9m-criado <strong>TodosController.php<\/strong> controller encontrado na pasta <strong>app\/Http\/Controllers<\/strong> e cole nos seguintes 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 um dos m\u00e9todos no <code>TodoController<\/code>, n\u00f3s adicionamos a fachada <code>Log<\/code> com um n\u00edvel de registro espec\u00edfico para definir o tipo de erro que queremos enviar. Abaixo est\u00e1 um exemplo de como usar o<\/p>\n<p>Fachada de log no 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>Formata\u00e7\u00e3o de mensagens de registro<\/h3>\n<p>Suponha que voc\u00ea n\u00e3o esteja confort\u00e1vel com o padr\u00e3o <code>LineFormatter<\/code> usado por Laravel, que faz um \u00f3timo trabalho de fornecer mensagens leg\u00edveis e \u00fateis.<\/p>\n<p>Nesse caso, voc\u00ea pode facilmente girar um objeto formatador personalizado para se ajustar ao seu caso de uso e us\u00e1-lo durante toda a aplica\u00e7\u00e3o.<\/p>\n<p>A documenta\u00e7\u00e3o oficial do Monolog d\u00e1 uma lista completa de <a href=\"https:\/\/github.com\/Seldaek\/monolog\/blob\/main\/doc\/02-handlers-formatters-processors.md#formatters\" target=\"_blank\" rel=\"noopener noreferrer\">formatadores dispon\u00edveis<\/a> e pode facilmente criar um formatador personalizado.<\/p>\n<p>Em Laravel, voc\u00ea pode facilmente configurar qualquer um dos drivers para usar seu formatador personalizado adicionando-o \u00e0 lista como abaixo dentro do arquivo de configura\u00e7\u00e3o localizado em <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>O exemplo acima adiciona um <code>MonologFormatterHtmlFormatter<\/code> personalizado ao driver <code>daily<\/code> usando a tecla <code>formatter<\/code> e <code>formatter_with<\/code> na configura\u00e7\u00e3o do canal <code>daily<\/code> para alterar o formato das datas.<\/p>\n<h3>Envio de registros para diferentes canais<\/h3>\n<p>Com a ajuda do Monolog, Laravel pode enviar registros para diferentes canais e m\u00faltiplos canais simultaneamente.<\/p>\n<p>Vamos demonstrar como enviar registros para o nosso canal Slack seguindo estes simples passos. Mude o canal de registro padr\u00e3o para Slack e adicione a URL <a href=\"https:\/\/api.slack.com\/messaging\/webhooks\" target=\"_blank\" rel=\"noopener noreferrer\">Slack Webhook<\/a> em seu arquivo <strong>.env.<\/strong><\/p>\n<pre><code class=\"markdown\">LOG_CHANNEL=slack\nLOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here<\/code><\/pre>\n<p>Em seguida, teste sua configura\u00e7\u00e3o registrando uma mensagem em seu aplicativo usando a fachada <code>Log<\/code> como a mostrada abaixo:<\/p>\n<pre><code class=\"markdown\">Log::debug(\"The API instance is on fire caused by:\", ['user' =&gt; 1])<\/code><\/pre>\n<p>Voc\u00ea pode abrir seu canal Slack para verificar o erro impresso no canal desejado que voc\u00ea especificou ao gerar a URL do Webhook.<\/p>\n<h2>Resumo<\/h2>\n<p>O Registro \u00e9 t\u00e3o importante quanto qualquer outro fator do seu aplicativo, se n\u00e3o for mais. \u00c9 por isso que \u00e9 sugerido pelo Manifesto dos 12 Fatores como uma das preocupa\u00e7\u00f5es mais cr\u00edticas de qualquer aplicativo moderno.<\/p>\n<p>Com o registro efetivo, voc\u00ea pode facilmente ler, visualizar erros e defeitos que acontecem em seu aplicativo pronto para produ\u00e7\u00e3o. Para este fim, \u00e9 importante que voc\u00ea implemente um registro estruturado em seu aplicativo desde o in\u00edcio do projeto.<\/p>\n\n<p>Neste artigo, exploramos o registro Laravel e porque voc\u00ea deve us\u00e1-lo em seu pr\u00f3ximo projeto. N\u00f3s discutimos em detalhes tanto o registro estruturado quanto o registro centralizado. Al\u00e9m disso, aprendemos como implementar o registro Laravel atrav\u00e9s da constru\u00e7\u00e3o de um aplicativo Todo.<\/p>\n<p>Como voc\u00ea planeja implementar o login em seu pr\u00f3ximo aplicativo? Informe-nos na se\u00e7\u00e3o de coment\u00e1rios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao desenvolver um aplicativo moderno, o registro deve estar no topo da lista de prioridades. O registro fornece uma maneira de visualizar seu aplicativo tanto no &#8230;<\/p>\n","protected":false},"author":193,"featured_media":52372,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[416,757,220,107,32],"topic":[996,984],"class_list":["post-52371","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-laravel","tag-logging","tag-monitoring","tag-performance","tag-php","topic-frameworks-php","topic-laravel"],"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>Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber<\/title>\n<meta name=\"description\" content=\"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no 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\/pt\/blog\/laravel-logging\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber\" \/>\n<meta property=\"og:description\" content=\"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no Laravel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-29T12:06:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T07:44:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no Laravel.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kaperskyguru\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Solomon Eseme\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\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\/pt\/blog\/laravel-logging\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/\"},\"author\":{\"name\":\"Solomon Eseme\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\"},\"headline\":\"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber\",\"datePublished\":\"2022-08-29T12:06:02+00:00\",\"dateModified\":\"2023-08-22T07:44:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/\"},\"wordCount\":2228,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png\",\"keywords\":[\"laravel\",\"logging\",\"monitoring\",\"performance\",\"php\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/\",\"name\":\"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png\",\"datePublished\":\"2022-08-29T12:06:02+00:00\",\"dateModified\":\"2023-08-22T07:44:23+00:00\",\"description\":\"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no Laravel.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frameworks PHP\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/frameworks-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\",\"name\":\"Solomon Eseme\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/solomoneseme\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber","description":"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no 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\/pt\/blog\/laravel-logging\/","og_locale":"pt_PT","og_type":"article","og_title":"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber","og_description":"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no Laravel.","og_url":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-08-29T12:06:02+00:00","article_modified_time":"2023-08-22T07:44:23+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png","type":"image\/png"}],"author":"Solomon Eseme","twitter_card":"summary_large_image","twitter_description":"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no Laravel.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png","twitter_creator":"@kaperskyguru","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Solomon Eseme","Tempo estimado de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/"},"author":{"name":"Solomon Eseme","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2"},"headline":"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber","datePublished":"2022-08-29T12:06:02+00:00","dateModified":"2023-08-22T07:44:23+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/"},"wordCount":2228,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png","keywords":["laravel","logging","monitoring","performance","php"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/","url":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/","name":"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png","datePublished":"2022-08-29T12:06:02+00:00","dateModified":"2023-08-22T07:44:23+00:00","description":"O registro \u00e9 vital para monitorar a sa\u00fade e a efic\u00e1cia de seus projetos de desenvolvimento. Aprenda como aplicar a explora\u00e7\u00e3o de registro estruturada no Laravel.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/laravel-logging.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/laravel-logging\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Frameworks PHP","item":"https:\/\/kinsta.com\/pt\/topicos\/frameworks-php\/"},{"@type":"ListItem","position":3,"name":"Registros no Laravel: Tudo o que Voc\u00ea Precisa Saber"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2","name":"Solomon Eseme","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/solomoneseme\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/52371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=52371"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/52371\/revisions"}],"predecessor-version":[{"id":53265,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/52371\/revisions\/53265"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/en"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/jp"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/es"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/translations\/se"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52371\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/52372"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=52371"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=52371"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=52371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}