Laravel Logging: tudo o que você precisa saber

Publicados: 2022-08-19

Ao desenvolver um aplicativo moderno, o registro em log deve estar no topo da lista de prioridades.

O registro em log fornece uma maneira de visualizar seu aplicativo no desenvolvimento e na produção, permitindo transparência e visibilidade. Com o registro devidamente estruturado, os aplicativos modernos podem se tornar mais fáceis de manter, pois podemos identificar proativamente pontos de falha e gargalos de desempenho em nosso aplicativo.

A estrutura Laravel vem com um sistema de registro robusto que lida com todos os obstáculos envolvidos na configuração de um sistema de registro devidamente estruturado pronto para uso. Este novo sistema de log introduzido no Laravel 6.5 é poderoso, e vamos explorá-lo neste artigo.

Este artigo explorará os fundamentos do log do Laravel e por que você deve usar o log do Laravel em seu próximo projeto. Discutiremos o registro estruturado e o registro centralizado em detalhes. Além disso, aprenderemos como implementar o log do Laravel construindo um aplicativo Todo.

Você tirará mais proveito deste artigo se já tiver o seguinte em seu currículo:

  • Bons conhecimentos de desenvolvimento web
  • Noções básicas de Laravel
  • Criando aplicativos com Laravel

O que é Laravel Logging?

O log do Laravel é sobre como o Laravel lida com o log, ou relatório automático de problemas, usando um sistema de log PHP viral chamado Monolog. No entanto, devido à filosofia do Laravel de usar bibliotecas populares existentes para implementar diferentes recursos do framework, o Laravel emprega o Monolog para todas as suas necessidades de registro.

Monolog é uma biblioteca de log PHP altamente flexível e popular que podemos configurar para enviar seus logs para arquivos, soquetes, bancos de dados e outros serviços da web. O Monolog fornece uma interface familiar para gravar logs de arquivos de texto padrão para serviços avançados de gerenciamento de log de terceiros. O Laravel normalmente configura o Monolog para usar um arquivo de configuração de log padrão.

Para obter mais informações sobre o Monolog e seus recursos, confira a documentação oficial, pois isso está além do escopo deste artigo.

Antes de nos aprofundarmos na configuração e implementação do log do Laravel usando o Monolog, vamos explorar mais razões para usar o log do Laravel e os diferentes tipos.

Por que usar o log do Laravel?

Por que o registro é necessário?

O manifesto do aplicativo Twelve-Factor trata o registro em log como uma das preocupações críticas de um aplicativo moderno, pois o registro é a chave para o desempenho e o monitoramento.

Os logs auxiliam no entendimento detalhado dos erros que acontecem na produção e de onde eles se originaram. Além disso, com estruturas de log adequadas, ele pode mostrar o usuário específico, a ação que causou o erro e a possível solução para correção e manutenção mais rápidas do bug.

O registro estruturado é um salva-vidas em aplicativos de produção, ajudando a solucionar defeitos e resolver problemas na produção. Além disso, você pode monitorar e coletar todas as suas mensagens de log em tempo real usando ferramentas de log especializadas para análise e relatórios ao vivo.

Por esses motivos, você precisa tornar o log estruturado uma prioridade máxima em seu próximo projeto de aplicativo moderno.

Vejamos a visão geral dos diferentes estilos de registro disponíveis.

Noções básicas de registro em Laravel

Aprender os fundamentos do registro ajudará você a entender como o Laravel lida com o registro e como você pode melhorar suas práticas de registro estruturado.

Vamos examinar dois conceitos essenciais em log para entender melhor como implementar nossos procedimentos de log.

Log Estruturado Laravel

No desenvolvimento de software, o log estruturado está implementando um formato de mensagem predeterminado e consistente para logs de aplicativos. Esse formato permite que as mensagens sejam tratadas como dados que podem ser monitorados, manipulados e visualizados muito melhor do que o formato de texto normal.

Você deve implementar uma abordagem de log estruturado em seu desenvolvimento de aplicativo moderno porque os arquivos de log são os ativos essenciais para desenvolvedores quando algo errado acontece com seu aplicativo em produção.

Como o Laravel usa o Monolog, os desenvolvedores podem implementar rapidamente o log estruturado configurando o logger para receber tipos específicos de informações, armazenando os arquivos de log em diferentes formatos e enviando os logs para vários serviços de gerenciamento de log de terceiros para visualização.

Registro centralizado em Laravel

Um sistema de registro centralizado é onde os registros são enviados para soluções de Gerenciamento de Registro Centralizado (CLM) de várias fontes para facilitar a consolidação e visualização. No entanto, o CLM é uma solução de registrador especializada que coleta mensagens de log de diferentes fontes e consolida os dados para facilitar o processamento e a visualização.

Além da coleta de dados, espera-se que o CLM também apoie a análise dos dados de log e a apresentação clara dos dados após a análise.

Log Estruturado x Log Básico

Vamos examinar a diferença entre o log estruturado e o log básico (não estruturado) e por que você deve usar o log estruturado em seu projeto Laravel.

Registro básico

No log básico, os arquivos de log são armazenados em um formato bruto com dados limitados para consultar e identificar logs individuais.

Ao usar o log básico, os desenvolvedores não poderão usar ferramentas analíticas de terceiros para ler, exibir e analisar logs, a menos que desenvolvam uma ferramenta personalizada ou usem uma ferramenta limitada que suporte seu formato de log.

Há três grandes razões para evitar o uso de log básico:

  1. Os sistemas de gerenciamento de logs centralizados não podem trabalhar com os dados sem suporte adicional.
  2. Uma solução customizada é necessária para ler e analisar os dados de uma solução de log básica.
  3. Pode ser um desafio para os administradores lerem dados básicos de log, pois são brutos e não estruturados.

Registro estruturado

O log estruturado economiza tempo dos desenvolvedores usando ferramentas analíticas de log de terceiros de código aberto que suportam a estrutura de log padrão para ler, visualizar e analisar logs.

Os logs são úteis se contiverem os dados corretos listados abaixo, que é o objetivo do log estruturado. Podemos usar os dados incluídos no registro estruturado para criar painéis, gráficos, tabelas e qualquer outra visualização útil para determinar a integridade do aplicativo.

Estes são exemplos básicos das informações que podemos incluir em mensagens de log estruturadas. Além disso, você pode personalizar completamente os dados para atender às suas necessidades.

Aqui estão alguns exemplos dos dados que você pode coletar com o registro estruturado:

  1. A porta usada para executar a função
  2. A data e hora em que o evento aconteceu
  3. O nome de usuário ou ID do cliente
  4. Uma descrição do evento (mensagem de log)
  5. O protocolo usado para executar a função
  6. A localização do evento acionado (indicar API ou aplicativo em execução)
  7. O ID exclusivo do evento
  8. O tipo de ação acionada (nível de log)

Os logs devem conter dados suficientes para visualizar facilmente a solução ou o motivo do evento de log. Além disso, observe que você não deve armazenar todos os tipos de informações, como senhas ou dados confidenciais em logs.

Agora que vislumbramos o que é o log do Laravel, vamos avançar para a implementação do log do Laravel construindo um aplicativo com o log como um cidadão de primeira classe.

Como implementar o log do Laravel com o aplicativo Todo

Agora vamos aplicar o que aprendemos até agora criando um novo projeto Laravel e implementando o log do Laravel.

Se você não usou o Laravel antes, pode ler o que é o Laravel ou dar uma olhada em nossa lista de excelentes tutoriais do Laravel para começar.

Configurando o Laravel

Primeiro, vamos criar uma nova instância do Laravel usando o comando abaixo. Você pode consultar a documentação oficial para saber mais.

Abra seu console e navegue até onde você armazena seus projetos PHP antes de executar os comandos abaixo. Certifique-se de ter o Composer instalado e configurado corretamente.

 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

Configurando e propagando o banco de dados

Em seguida, vamos configurar nosso banco de dados, criar um novo modelo Todo e propagar 200 dados falsos para teste.

Abra seu cliente de banco de dados e crie um novo banco de dados. Faremos o mesmo com o nome laravel_logging_app_db e então preencheremos nosso arquivo .env com as credenciais do banco de dados:

 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

Em seguida, executaremos o seguinte comando para criar a migração e o modelo Todo simultaneamente:

 php artisan make:model Todo -mc

Abra a migração recém-criada encontrada database/migrations/xxx-create-todos-xxx.php e cole os seguintes 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'); } }

Você pode semear seus todos com dados faker aprendendo a propagar seus bancos de dados em Laravel usando o Faker.

Lutando com problemas de tempo de inatividade e WordPress? Kinsta é a solução de hospedagem projetada para economizar seu tempo! Confira nossas funcionalidades

Visão geral do Monólogo

Com o Laravel Monolog, você pode transmitir e enviar logs estruturados para diferentes canais, como e-mails, Slack, arquivos, soquetes, caixas de entrada, bancos de dados e vários serviços da web. No Laravel, você pode configurar o log a partir de um único arquivo de configuração localizado em config/logging.php .

O arquivo de configuração vem com drivers de log predefinidos para escolher, e o driver padrão é uma stack que usa o canal single para registrar em um arquivo laravel.log encontrado na pasta storage/logs . Demonstraremos o log estruturado usando alguns drivers de log do Laravel.

O Laravel fornece um punhado de métodos para interagir com Logs, como demonstrado geralmente no arquivo do controlador TodosController.php em breve.

Escrevendo mensagens de log no controlador

Abra o recém-criado arquivo do controlador TodosController.php encontrado na pasta app/Http/Controllers e cole os seguintes 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 um dos métodos do TodoController , adicionamos a fachada Log com um nível de log específico para definir o tipo de erro que queremos enviar. Segue abaixo um exemplo de uso do

Fachada de log no método 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 }

Formatando mensagens de registro

Suponha que você não esteja confortável com o LineFormatter padrão usado pelo Laravel, que faz um ótimo trabalho ao fornecer mensagens legíveis e úteis.

Nesse caso, você pode facilmente criar um objeto formatador personalizado para se adequar ao seu caso de uso e usá-lo em todo o aplicativo.

A documentação oficial do Monolog fornece uma lista completa de formatadores disponíveis e pode facilmente criar um personalizado.

No Laravel, você pode configurar facilmente qualquer um dos drivers para usar seu formatador personalizado adicionando-o à lista como abaixo dentro do arquivo de configuração localizado em 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', ] ],

O exemplo acima adiciona um MonologFormatterHtmlFormatter personalizado ao driver daily usando o formatter e a chave formatter_with na configuração do canal daily para alterar o formato das datas.

Enviando Logs para Diferentes Canais

Com a ajuda do Monolog, o Laravel pode enviar logs para diferentes canais e vários canais simultaneamente.

Vamos demonstrar como enviar logs para nosso canal do Slack seguindo estas etapas simples. Altere o canal de log padrão para Slack e adicione a URL do Webhook do Slack ao seu arquivo .env .

 LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

Em seguida, teste sua configuração registrando uma mensagem em seu aplicativo usando a fachada de Log como a mostrada abaixo:

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

Você pode abrir seu canal do Slack para verificar o erro impresso no canal desejado que você especificou ao gerar o URL do Webhook.

Resumo

O registro em log é tão importante quanto qualquer outro fator de seu aplicativo, se não mais. É por isso que é sugerido pelo manifesto do Twelve-Factor App como uma das preocupações mais críticas de qualquer aplicativo moderno.

Com um registro eficaz, você pode ler, visualizar e visualizar facilmente erros e defeitos que ocorrem em seu aplicativo pronto para produção. Para isso, é importante que você implemente o log estruturado em seu aplicativo desde o início do projeto.

Neste artigo, exploramos o log do Laravel e por que você deve usá-lo em seu próximo projeto. Discutimos detalhadamente o registro estruturado e o registro centralizado. Além disso, aprendemos como implementar o log do Laravel criando um aplicativo Todo.

Como você planeja implementar o login em seu próximo aplicativo? Deixe-nos saber na seção de comentários.