Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Implementando PSR-3 com Monolog

Códigos utilizados nessa palestra:
https://github.com/gmsantos/tdc-php-logs

Vamos entender importância dos logs e como eles podem ser utilizados além de uma forma de debug. Vamos conhecer níveis de criticidade definidos pela PSR-3, como funciona o Monolog e como podemos configurá-lo para permitir um melhor aproveitamento dos logs gerados pelas nossas aplicações.

  • Sé el primero en comentar

Implementando PSR-3 com Monolog

  1. 1. Implementando PSR-3 com Monolog
  2. 2. Gabriel Machado Autor dos cursos de cloud computing PHP e DevOps gmsantos gmsantos__ gmsantos gmsantos
  3. 3. Conteúdo • O que são logs? • Como escrever um bom log • PSR-3 • Monolog • Analisando os logs
  4. 4. O que são Logs? • É uma expressão utilizada para descrever o processo de registro de eventos relevantes • Utilizado para determinar o o que aconteceu numa aplicação • Auditoria • Diagnóstico de problemas em sistemas Fonte: Wikipedia
  5. 5. O que são Logs?
  6. 6. O que são Logs?
  7. 7. O que são Logs?
  8. 8. Como escrever um bom log Implementando PSR-3 com Monolog
  9. 9. Ser claro e informativo // mensagens que não descrevem o que está acontecendo [2017-07-20 02:41:11] INFO: foi [2017-07-20 02:41:11] DEBUG: vai [2017-07-20 02:41:11] NOTICE: passou!! [2017-07-20 02:41:11] DEBUG: 2 [2017-07-20 02:41:11] DEBUG: 3 [2017-07-20 02:41:11] DEBUG: 4 // sem detalhes do evento [2017-07-20 02:41:11] WARNING: Unable to sync Sale Order
  10. 10. Ser claro e informativo // Explicar o que está acontecendo [2017-07-20 02:48:25] INFO: Starting csv file import {"file":"/path/file.csv"} [] [2017-07-20 02:48:25] DEBUG: Reading csv file [] [] [2017-07-20 02:48:25] NOTICE: Skip header {"line":1} [] [2017-07-20 02:48:25] DEBUG: Loading row 2 {"line":2,"data":{"some":"data"}} [] [2017-07-20 02:48:25] DEBUG: Loading row 3 {"line":3,"data":{"some":"data"}} [] [2017-07-20 02:48:25] DEBUG: Loading row 4 {"line":4,"data":{"some":"data"}} [] // Incluir informações auxiliares [2017-07-20 02:48:25] WARNING: Unable to sync Sale Order {"id":123} {"file":"/mnt/c/Users/gabri/Projects/tdc/good- logs.php","line":32,"class":null,"function":null}
  11. 11. Fácil de pesquisar e agrupar // Necessário agrupar com uma regex '/Allowed memory size of d+ bytes exhausted/' ERROR: Allowed memory size of 5202142 bytes exhausted (tried to allocate 370697 bytes) ERROR: Allowed memory size of 2916448 bytes exhausted (tried to allocate 251567 bytes) ERROR: Allowed memory size of 4127488 bytes exhausted (tried to allocate 895479 bytes) // Incluir tags INFO: Starting csv file import {"file":"/path/file.csv"} {"tags":["integration","product"]} NOTICE: Skip header {"line":1} {"tags":["integration","product"]} DEBUG: Loading row 2 {"line":2,"data":{"some":"data"}} {"tags":["integration","product"]} DEBUG: Loading row 3 {"line":3,"data":{"some":"data"}} {"tags":["integration","product"]} DEBUG: Loading row 4 {"line":4,"data":{"some":"data"}} {"tags":["integration","product"]}
  12. 12. Implementar níveis de criticidade
  13. 13. PSR-3 Implementando PSR-3 com Monolog
  14. 14. PSR-3 • Padrão de Logs para PHP • De acordo com os níveis de criticidade da IETF RFC 5424 • Algumas implementações: monolog, zend-log, log4php • Integrado ao seu código utilizando a sua interface Repositório da interface Especificação da PSR-3
  15. 15. PSR-3 <?php namespace AppController; use PsrLogLoggerInterface; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentHttpFoundationResponse; class DefaultController { public function index(Request $request, LoggerInterface $log) { $log->info('Hello World!'); return new Response('Welcome'); } }
  16. 16. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Debug Contém informações detalhadas para debug Geralmente é desligado em produção (Ex: Iterações de um loop, query SQL gerada pelo ORM)
  17. 17. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Info Eventos comuns ocorridos no sistema (Ex.: Usuário fez login, hits na API)
  18. 18. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Notice Eventos comuns, porém com certa relevância no sistema
  19. 19. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Warning Eventos não caracterizados como erro, mas que merecem uma certa atenção (Ex.: Uso de funções descontinuadas)
  20. 20. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Error Erros encontrados em tempo de execução Exceptions não tratadas aparecem aqui
  21. 21. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Critical Condições críticas no sistema, como falha de serviços externos Pode ser usado para medir nível de serviço (SLA)
  22. 22. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Alert Requer uma ação corretiva imediata Aqui alguém vai te ligar, enviar SMS, @channel no Slack, sinal de fumaça
  23. 23. Níveis de Criticidade 0 1 2 3 4 5 6 7 8 Level • Emergency Sistema está em um estado não utilizável É raro no nível da aplicação
  24. 24. Monolog Implementando PSR-3 com Monolog
  25. 25. Monolog • Criado por um dos criadores do Composer (@Seldaek) • Implementação a PSR-3 • Versão 2.0 lançada recentemente (suporte PHP 7.2+) • Versão 1.0 é mantida por enquanto (PHP 5.3+) • Já vem integrado em Frameworks como Symfony e Laravel
  26. 26. Monolog • Handlers • Destino do log • Formatters • Formato em que o log será enviado • Processors • Informações extras para o log
  27. 27. Handlers • StreamHandler • RotatingFileHandler • SlackWebhookHandler • MandrillHandler • NewRelicHandler • LogEntriesHandler • NullHandler
  28. 28. Formatters • LineFormatter • HtmlFormatter • JsonFormatter • ChromePHPFormatter • LogstashFormatter
  29. 29. Processors • PsrLogMessageProcessor • IntrospectionProcessor • WebProcessor • MemoryPeakUsageProcessor • GitProcessor • TagProcessor
  30. 30. Exemplos <?php require_once __DIR__ . '/vendor/autoload.php'; use MonologHandlerStreamHandler; use MonologLogger; $logger = new Logger('my_logger'); $logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log')); $logger->info('Hello World!'); // my_app.log: [2017-07-20 00:51:27] my_logger.INFO: Hello World! [] []
  31. 31. Exemplos use MonologHandlerRotatingFileHandler; $logger->pushHandler(new RotatingFileHandler(__DIR__.'/error.log', 3, Logger::ERROR)); $logger->debug('Debug event'); $logger->error('Error event'); // my_app.log: [2017-07-20 01:10:21] my_logger.DEBUG: Debug event [] [] [2017-07-20 01:10:21] my_logger.ERROR: Error event [] [] // error-2017-07-20.log [2017-07-20 01:10:22] my_logger.ERROR: Error event [] []
  32. 32. Exemplos use MonologProcessorIntrospectionProcessor; $logger->pushProcessor(new IntrospectionProcessor(Logger::WARNING)); $logger->notice('Important event'); $logger->warning('Deprecated: Lorem Ipsum...'); // my_app.log: [2017-07-20 01:25:02] my_logger.NOTICE: Important event [] [] [2017-07-20 01:26:03] my_logger.WARNING: Deprecated: Lorem Ipsum... [] {"file":"/mnt/c/Users/gabri/Projects/tdc/bootstrap.php","line":21,"class":null,"function":n ull}
  33. 33. Analisando os logs Implementando PSR-3 com Monolog
  34. 34. Boas práticas • Antecipe problemas analisando seus logs • Tenha rotinas para ver logs não críticos • Não use seus logs só para apagar incêndios • Crie visualizações a partir dos seus logs
  35. 35. Como visualizar? • Na sua maquina local, pode acessar diretamente o arquivo $ tail -f /path/to/log
  36. 36. Como visualizar? • Em produção, caso tenha acesso a máquina via ssh $ ssh -i ~/.ssh/key.pem user@host tail –f /path/to/log • E se o seu ambiente for composto por 35 hosts?
  37. 37. Você pode precisar de • Agregação e centralização de logs • Pesquisa por determinadas ocorrências • Geração de métricas (KPIs e SLA) • Alertas e notificações
  38. 38. Serviços Externos
  39. 39. Sentry
  40. 40. Sentry
  41. 41. Exemplo: Dashboard para Queues do Laravel Implementando PSR-3 com Monolog
  42. 42. public function boot() { Queue::before(function (JobProcessing $event) { Log::channel('queue')->info('Processing {job} on {connectionName}', [ 'status' => 'processing', 'job' => $event->job->payload()['displayName'] ?? get_class($event->job), 'connectionName' => $event->connectionName, ]); }); Queue::after(function (JobProcessed $event) { Log::channel('queue')->info('Processed {job} on {connectionName}', [ 'status' => 'done', 'job' => $event->job->payload()['displayName'] ?? get_class($event->job), 'connectionName' => $event->connectionName, ]); }); Queue::failing(function (JobFailed $event) { Log::channel('queue')->error('Failed {job} on {connectionName}', [ 'status' => 'failed', 'job' => $event->job->payload()['displayName'] ?? get_class($event->job), 'connectionName' => $event->connectionName, 'exceptionMessage' => $event->exception->getMessage(), 'expection' => $event->exception, ]); }); }
  43. 43. Resumindo... • Organize os logs gerados pela aplicação • Crie processos para revisar e analisar seus logs • Envie alertas para processos críticos • Evolua como você trata os logs da sua aplicação a medida que ela cresce
  44. 44. Obrigado! gmsantos gmsantos__ gmsantos gmsantos

×