Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Logs: Porque um ElePHPant tem que ter boa memória!

Logs: Porque um ElePHPant tem que ter boa memória!

O que são logs, por que são importantes e como gerá-los com PHP e Monolog.

Er Galvão Abbott

August 23, 2016
Tweet

More Decks by Er Galvão Abbott

Other Decks in Technology

Transcript

  1. Logs: Porque um ElePHPant tem que ter boa memória! Logs:

    Porque um ElePHPant tem que ter boa memória! www.galvao.eti.br CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott - 11/10/16 - 1 / 36 Some icons by IconFinder
  2. Presidente da ABRAPHP – Associação Brasileira de Profissionais PHP Diretor

    da PHP Conference Brasil Contribui para a tradução da documentação oficial Atua como Zend Framework Evangelist para o ZTeam, da Zend. Professor (Especialista) de Pós-Graduação UNOESC (SC) e Faculdade Alfa (PR) 20+ anos desenvolvendo sistemas e aplicações com interface web 15+ destes com PHP 7+ com Zend Framework Palestrante em eventos nacionais e internacionais Instrutor de cursos presenciais e a distância Fundador e líder do GU PHPBR Fundador* e membro do GU PHPRS Site: http://www.galvao.eti.br/ http://people.php.net/galvao Twitter: @galvao Slides e Documentos: http://speakerdeck.com/galvao http://slideshare.net/ergalvao Github: http://github.com/galvao Posts: https://medium.com/@galvao Quem?! CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott - 11/10/16 - 2 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória!
  3. Logs CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 3 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Logs são a memória de um Sistema, a sua História: são a forma de encontrar eventuais situações importantes em um mar de 'irrelevância'. “ “
  4. Logs CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 4 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Logs são a memória de um Sistema, a sua História: são a forma de encontrar eventuais situações importantes em um mar de 'irrelevância'. “ “ – Eu
  5. Padrões CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 5 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Camadas de Log: Conteúdo Aplicação Transporte Informação contida Geração, Interpretação, Roteamento e Armazenamento Coloca e remove na “fila” Mensagens de Log
  6. F.A.Q. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 6 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! X X
  7. Logs !≃ Erros CC Attribution-ShareAlike 3.0 Unported License by Er

    Galvão Abbott - 11/10/16 - 7 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! + + Timestamp Severidade Debug Info Notice Warning Error Critical Alert Emergency Mensagem
  8. Logs !≃ Erros CC Attribution-ShareAlike 3.0 Unported License by Er

    Galvão Abbott - 11/10/16 - 8 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória!
  9. Logs !≃ Erros CC Attribution-ShareAlike 3.0 Unported License by Er

    Galvão Abbott - 11/10/16 - 9 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Similaridades nas Ocorrências Disputas Situações peculiares Problemas potenciais Gargalos Falhas humanas Análise } } } }
  10. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 10 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Monolog FTW! composer require monolog/monolog --- use Monolog\Logger; use Monolog\Handler\StreamHandler; $logger = new Logger('LoggerName'); $logger->pushHandler(new StreamHandler(path_to_log_file));
  11. Monolog CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 11 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Camadas de Log: Conteúdo Aplicação Transporte Monolog\Formatter Monolog\Handler* Monolog\Logger Mensagens de Log
  12. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 12 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Um exemplo real* <?php namespace ComPHPartment\Logger; use Monolog\Logger; use Monolog\Handler\StreamHandler; use ComPHPartment\ComPHPartment; class LogWrapper { const LOG_PATH = '/data/log'; public static $logger; public static $logFile = 'comPHPartment.log'; public static function getWrapper() { $absLogPath = ComPHPartment::getBasePath() . self::LOG_PATH . '/' . self::$logFile; self::$logger = new Logger('cLogger'); self::$logger->pushHandler(new StreamHandler($absLogPath)); return self::$logger; } }
  13. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 13 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public function authenticate() { $this->logger->info('Trying to authenticate to Pocket API'); try { $response = $this->client->post( self::POCKET_AUTHENTICATION_URI, [ 'headers' => self::$requestHeaders, 'form_params' => [ 'consumer_key' => self::$key, 'redirect_uri' => self::$redirectURI, ], 'timeout' => 10, ] ); } catch (ClientException $e) { $pocketExtraInfo = $e->getResponse()->getHeaders(); $this->logger->error('Failed to authenticate to Pocket API.', $pocketExtraInfo); throw new \Exception('Autnenticaton with the Pocket API has failed: ' . $e->getMessage()); } $this->logger->info('Successfully authenticated to Pocket API'); ... Um exemplo real*
  14. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 14 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public function authenticate() { $this->logger->info('Trying to authenticate to Pocket API'); try { $response = $this->client->post( self::POCKET_AUTHENTICATION_URI, [ 'headers' => self::$requestHeaders, 'form_params' => [ 'consumer_key' => self::$key, 'redirect_uri' => self::$redirectURI, ], 'timeout' => 10, ] ); } catch (ClientException $e) { $pocketExtraInfo = $e->getResponse()->getHeaders(); $this->logger->error('Failed to authenticate to Pocket API.', $pocketExtraInfo); throw new \Exception('Autnenticaton with the Pocket API has failed: ' . $e->getMessage()); } $this->logger->info('Successfully authenticated to Pocket API'); ... Um exemplo real*
  15. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 15 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public function authenticate() { $this->logger->info('Trying to authenticate to Pocket API'); try { $response = $this->client->post( self::POCKET_AUTHENTICATION_URI, [ 'headers' => self::$requestHeaders, 'form_params' => [ 'consumer_key' => self::$key, 'redirect_uri' => self::$redirectURI, ], 'timeout' => 10, ] ); } catch (ClientException $e) { $pocketExtraInfo = $e->getResponse()->getHeaders(); $this->logger->error('Failed to authenticate to Pocket API.', $pocketExtraInfo); throw new \Exception('Autnenticaton with the Pocket API has failed: ' . $e->getMessage()); } $this->logger->info('Successfully authenticated to Pocket API'); ... Um exemplo real*
  16. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 16 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public function authenticate() { $this->logger->info('Trying to authenticate to Pocket API'); try { $response = $this->client->post( self::POCKET_AUTHENTICATION_URI, [ 'headers' => self::$requestHeaders, 'form_params' => [ 'consumer_key' => self::$key, 'redirect_uri' => self::$redirectURI, ], 'timeout' => 10, ] ); } catch (ClientException $e) { $pocketExtraInfo = $e->getResponse()->getHeaders(); $this->logger->error('Failed to authenticate to Pocket API.', $pocketExtraInfo); throw new \Exception('Autnenticaton with the Pocket API has failed: ' . $e->getMessage()); } $this->logger->info('Successfully authenticated to Pocket API'); ... Um exemplo real*
  17. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 17 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! $ cat data/logs/comphpartment.log [2016-08-11 08:40:02] cLogger.INFO: Trying to authenticate to Pocket API [] [] [2016-08-11 08:40:03] cLogger.ERROR: Failed to authenticate to Pocket API. {"Cache-Control":["private"],"Content-Type":["text/html; charset=UTF-8"], "Date":["Thu, 11 Aug 2016 11:40:03 GMT"],"Expires":["Thu, 19 Nov 1981 08:52:00 GMT"], "P3P":["policyref=\"/w3c/p3p.xml\", CP=\"ALL CURa ADMa DEVa OUR IND UNI COM NAV INT STA PRE\""], "Pragma":["no-cache"],"Server":["Apache"],"Set-Cookie":["PHPSESSID=8r2q9fs3hejuunl7dn4s9s6l37; path=/"],"Status":["403 Forbidden"],"Vary":["Accept-Encoding"],"X-Error":["Invalid consumer key."], "X-Error-Code":["152"],"X-Source":["Pocket"],"Content-Length":["13"],"Connection":["keep-alive"]} [] [2016-08-11 10:20:55] cLogger.INFO: Trying to authenticate to Poket API [] [] [2016-08-11 10:20:56] cLogger.INFO: Successfully authenticated to Pocket API [] [] [2016-08-11 10:34:50] cLogger.INFO: Trying to authenticate to Pocket API [] [] [2016-08-11 10:34:52] cLogger.INFO: Successfully authenticated to Pocket API [] [] [2016-08-11 10:34:57] cLogger.INFO: Waiting for User Authorization [] [] Um exemplo real*
  18. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 18 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! $ cat data/logs/comphpartment.log|grep Failed [2016-08-11 08:25:13] cLogger.ERROR: Failed to authenticate to Pocket API: Client error: `POST https://getpocket.com/v3/oauth/request` resulted in a `403 Forbidden` response: 403 Forbidden [] [] [2016-08-11 08:27:51] cLogger.ERROR: Failed to authenticate to Pocket API: Client error: `POST https://getpocket.com/v3/oauth/request` resulted in a `403 Forbidden` response: 403 Forbidden [] [] [2016-08-11 08:28:08] cLogger.ERROR: Failed to authenticate to Pocket API: Client error: `POST https://getpocket.com/v3/oauth/request` resulted in a `403 Forbidden` response: 403 Forbidden [] [] Um exemplo real*
  19. Monolog: Padrões CC Attribution-ShareAlike 3.0 Unported License by Er Galvão

    Abbott - 11/10/16 - 19 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! [2016-08-11 06:35:08] cLogger.INFO: Trying to authenticate to Pocket API [] [] $ cat data/logs/comphpartment.log Formatter padrão:
  20. Monolog: Padrões CC Attribution-ShareAlike 3.0 Unported License by Er Galvão

    Abbott - 11/10/16 - 20 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! [2016-08-11 06:35:08] cLogger.INFO: Trying to authenticate to Pocket API [] [] Data/Hora $ cat data/logs/comphpartment.log Formatter padrão:
  21. Monolog: Padrões CC Attribution-ShareAlike 3.0 Unported License by Er Galvão

    Abbott - 11/10/16 - 21 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! [2016-08-11 06:35:08] cLogger.INFO: Trying to authenticate to Pocket API [] [] Data/Hora Nome do Logger/Severidade $ cat data/logs/comphpartment.log Formatter padrão:
  22. Monolog: Padrões CC Attribution-ShareAlike 3.0 Unported License by Er Galvão

    Abbott - 11/10/16 - 22 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! [2016-08-11 06:35:08] cLogger.INFO: Trying to authenticate to Pocket API [] [] Data/Hora Nome do Logger/Severidade Mensagem $ cat data/logs/comphpartment.log Formatter padrão:
  23. Monolog: Padrões CC Attribution-ShareAlike 3.0 Unported License by Er Galvão

    Abbott - 11/10/16 - 23 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! [2016-08-11 06:35:08] cLogger.INFO: Trying to authenticate to Pocket API [] [] Data/Hora Nome do Logger/Severidade Mensagem Contexto $ cat data/logs/comphpartment.log Formatter padrão: Extra
  24. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 24 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public static function getWrapper($loggerName = 'accessLogger') { switch ($loggerName) { case 'accessLogger': $folder = 'access'; break; case 'errorLogger': $folder = 'error'; break; } self::$logFile = date('Y-m-d') . '.log'; $absLogPath = ComPHPartment::getBasePath() . self::LOG_PATH . '/' . $folder . '/' . self::$logFile; self::$log = new Logger($loggerName); ... ...
  25. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 25 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public static function getWrapper($loggerName = 'accessLogger') { switch ($loggerName) { case 'accessLogger': $folder = 'access'; break; case 'errorLogger': $folder = 'error'; break; } self::$logFile = date('Y-m-d') . '.log'; $absLogPath = ComPHPartment::getBasePath() . self::LOG_PATH . '/' . $folder . '/' . self::$logFile; self::$log = new Logger($loggerName); ... ...
  26. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 26 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public static function getWrapper($loggerName = 'accessLogger') { switch ($loggerName) { case 'accessLogger': $folder = 'access'; break; case 'errorLogger': $folder = 'error'; break; } self::$logFile = date('Y-m-d') . '.log'; $absLogPath = ComPHPartment::getBasePath() . self::LOG_PATH . '/' . $folder . '/' . self::$logFile; self::$log = new Logger($loggerName); ... ...
  27. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 27 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! public static function getWrapper($loggerName = 'accessLogger') { switch ($loggerName) { case 'accessLogger': $folder = 'access'; break; case 'errorLogger': $folder = 'error'; break; } self::$logFile = date('Y-m-d') . '.log'; $absLogPath = ComPHPartment::getBasePath() . self::LOG_PATH . '/' . $folder . '/' . self::$logFile; self::$log = new Logger($loggerName); ... ...
  28. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 28 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! … use Monolog\Formatter\LineFormatter; ... $tsFormat = date('H:i:s'); $output = "%datetime% > %level_name% > %message% %context% %extra%" . PHP_EOL; $formatter = new LineFormatter($output, $tsFormat); $stream = new StreamHandler($absLogPath); $stream->setFormatter($formatter); self::$log = new Logger($loggerName); self::$log->pushHandler($stream);
  29. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 29 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! … use Monolog\Formatter\LineFormatter; ... $tsFormat = date('H:i:s'); $output = "%datetime% > %level_name% > %message% %context% %extra%" . PHP_EOL; $formatter = new LineFormatter($output, $tsFormat); $stream = new StreamHandler($absLogPath); $stream->setFormatter($formatter); self::$log = new Logger($loggerName); self::$log->pushHandler($stream);
  30. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 30 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! … use Monolog\Formatter\LineFormatter; ... $tsFormat = date('H:i:s'); $output = "%datetime% > %level_name% > %message% %context% %extra%" . PHP_EOL; $formatter = new LineFormatter($output, $tsFormat); $stream = new StreamHandler($absLogPath); $stream->setFormatter($formatter); self::$log = new Logger($loggerName); self::$log->pushHandler($stream);
  31. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 31 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! … use Monolog\ErrorHandler; ... public static function getWrapper($loggerName = 'accessLogger') { … ErrorHandler::register(self::$logger); ...
  32. Monolog: Melhorias e Customizações CC Attribution-ShareAlike 3.0 Unported License by

    Er Galvão Abbott - 11/10/16 - 32 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! … use Monolog\ErrorHandler; ... public static function getWrapper($loggerName = 'accessLogger') { … ErrorHandler::register(self::$logger); ...
  33. Monolog++ CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 33 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Handlers Syslog Process [NativeMail|SwiftMailer] Slack MongoDB ElasticSearch Redis FirePHP LogStash LogEntries NewRelic ZendMonitor ...
  34. CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott -

    11/10/16 - 34 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! Formatters HTML JSON … Processors Web MemoryUsage MemoryPeak ProcessId Git Tag ... Monolog++
  35. Referências CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 35 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! RFC 5424 – Protocolo Syslog PSR 3 – Logger Interface Monolog ComPHPartment
  36. Obrigado! CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott

    - 11/10/16 - 36 / 36 www.galvao.eti.br Logs: Porque um ElePHPant tem que ter boa memória! ? Dúvidas? ↓ Críticas? ↑ Elogios?!