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
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!
- 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'. “ “
- 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
- 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
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/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
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; } }
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*
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*
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*
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*
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*
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:
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:
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:
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:
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
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); ...
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); ...
- 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 ...
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++
- 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