SlideShare uma empresa Scribd logo
1 de 52
Logs, pra que te quero!
Meetup PHP Vale
Gabriel Machado
Autor dos cursos de cloud computing
PHP, DevOps, Data
gmsantos
gmsantos__
gmsantos
gmsantos
Meetup PHP Vale
O que são Logs?
• “Quando o homem avançou o mar, na época dos grandes
descobrimentos, para deixar registrado os eventos ocorridos
durante a viagem foi comum a criação de um log, no sentido
de ser um 'diário de bordo'.” - Wikipedia
Meetup PHP Vale
O que são Logs?
Meetup PHP Vale
O que são Logs?
Meetup PHP Vale
O que são Logs?
Meetup PHP Vale
O que são Logs?
Meetup PHP Vale
Características de um bom log
Logs, pra que te quero!
Meetup PHP Vale
Ser claro e informativo
// mensagens que não dizem nada
[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
Meetup PHP Vale
Ter contexto
// 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 sobre o contexto
[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}
Meetup PHP Vale
Fácil de pesquisar e agrupar
// Repensar logs com mensagem dinâmica
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"]}
Meetup PHP Vale
Utilizar níveis de criticidade
Meetup PHP Vale
Analise seus logs
• 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 Dashboards a partir dos seus logs
Meetup PHP Vale
PSR-3
Logs, pra que te quero!
Meetup PHP Vale
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
Especificação da PSR-3
Meetup PHP Vale
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)
Meetup PHP Vale
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)
Meetup PHP Vale
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
Meetup PHP Vale
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)
Meetup PHP Vale
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
Meetup PHP Vale
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)
Meetup PHP Vale
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
Meetup PHP Vale
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
Meetup PHP Vale
Monolog
Logs, pra que te quero!
Meetup PHP Vale
Monolog
• Criado por um dos criadores do Composer (@Seldaek)
• Implementa 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
Meetup PHP Vale
Monolog
• Handlers
• Destino do log
• Formatters
• Formato em que o log será enviado
• Processors
• Informações extras para o log
Meetup PHP Vale
Handlers
• StreamHandler
• RotatingFileHandler
• SlackWebhookHandler
• MandrillHandler
• NewRelicHandler
• LogEntriesHandler
• NullHandler
Meetup PHP Vale
Formatters
• LineFormatter
• HtmlFormatter
• JsonFormatter
• ChromePHPFormatter
• LogstashFormatter
Meetup PHP Vale
Processors
• PsrLogMessageProcessor
• IntrospectionProcessor
• WebProcessor
• MemoryPeakUsageProcessor
• GitProcessor
• TagProcessor
Meetup PHP Vale
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! [] []
Meetup PHP Vale
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 [] []
Meetup PHP Vale
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}
Meetup PHP Vale
Exemplos
$data = ['user' => 'TDC'];
$logger->info('User '. $data['user'] .' logged', $data); // without Psr Processor
use MonologProcessorPsrLogMessageProcessor;
$logger->info('User {user} logged', $data); // with Psr Processor
// my_app.log:
[2017-07-20 01:25:02] my_logger.INFO: User TDC logged {"user":"TDC"} []
[2017-07-20 01:25:02] my_logger.INFO: User TDC logged {"user":"TDC"} []
Meetup PHP Vale
Exemplos
$rotatingFileHandler = $logger->popHandler();
$fileHandler = $logger->popHandler();
$htmlHandler = new StreamHandler(__DIR__.'/log.html', Logger::DEBUG);
use MonologFormatterLineFormatter; use MonologFormatterJsonFormatter;
use MonologFormatterHtmlFormatter;
$fileHandler->setFormatter(new LineFormatter("%level_name%: %message% %context% %extra%n"));
$rotatingFileHandler->setFormatter(new JsonFormatter());
$htmlHandler->setFormatter(new HtmlFormatter());
$logger->setHandlers([$fileHandler, $rotatingFileHandler, $htmlHandler]);
$logger->error('Unhandled Expection: Lorem ipsum', ['user' => 'locaweb']);
$logger->critical('User {user} is trying to hack us!', ['id' => 666, 'user' => 'locaweb',]);
Meetup PHP Vale
Exemplos
// my_app.log
[2017-07-20 02:00:18] my_logger.INFO: User locaweb logged {"user":"locaweb "} []
ERROR: Unhandled Expection: Lorem ipsum {"user":"locaweb"}
{"file":"/mnt/c/Users/gabri/Projects/tdc/bootstrap.php","line":51,"class":null,"function":n
ull}
CRITICAL: User locaweb is trying to hack us! {"id":666,"user":"locaweb "}
{"file":"/mnt/c/Users/gabri/Projects/tdc/bootstrap.php","line":52,"class":null,"function":n
ull}
Meetup PHP Vale
Exemplos
// error-2017-07-20.log
[2017-07-20 02:00:18] my_logger.ERROR: Error event [] []
{"message":"Unhandled Expection: Lorem
ipsum","context":{"user":"locaweb"},"level":400,"level_name":"ERROR","channel":"my_logger",
"datetime":{"date":"2017-07-20
02:00:18.608935","timezone_type":3,"timezone":"UTC"},"extra":{"file":"/mnt/c/Users/gabri/Pr
ojects/tdc/bootstrap.php","line":51,"class":null,"function":null}}
{"message":"User locaweb is trying to hack
us!","context":{"id":666,"user":"locaweb"},"level":500,"level_name":"CRITICAL","channel":"m
y_logger","datetime":{"date":"2017-07-20
02:00:18.610325","timezone_type":3,"timezone":"UTC"},"extra":{"file":"/mnt/c/Users/gabri/Pr
ojects/tdc/bootstrap.php","line":52,"class":null,"function":null}}
Meetup PHP Vale
Exemplos
Meetup PHP Vale
Como usar no seu projeto?
Logs, pra que te quero!
Meetup PHP Vale
Projetos com suporte Monolog
• Symfony
• Laravel
• Zend Framework *
• Drupal *
• Magento
• Expressive *
• Silex
• Lumen
Meetup PHP Vale
Analisando os logs
Logs, pra que te quero!
Meetup PHP Vale
Como visualizar?
• Na sua maquina local, pode acessar diretamente o arquivo
$ tail -f /path/to/log
Meetup PHP Vale
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?
Meetup PHP Vale
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
Meetup PHP Vale
Serviços Externos
Sentry
Meetup PHP Vale
Sentry
Meetup PHP Vale
Exemplo: Dashboard para
Queues do Laravel
Logs, pra que te quero!
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,
]);
});
}
Resumindo...
• Organize os logs gerados pela aplicação
• Crie processos de revisão periódica dos logs
• Automatize o envio de alertas
• Centralize os logs da aplicação
• Cruze com outros logs (servidor web, banco de dados)
Meetup PHP Vale
Obrigado!
gmsantos
gmsantos__
gmsantos
gmsantos
Meetup PHP Vale

Mais conteúdo relacionado

Mais procurados

Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopAlexei Znamensky
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineOtávio Calaça Xavier
 
Doctrine 2 camada de persistência para php
Doctrine 2   camada de persistência para phpDoctrine 2   camada de persistência para php
Doctrine 2 camada de persistência para phpFabio B. Silva
 

Mais procurados (12)

Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl Workshop
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
Redis na Prática
Redis na PráticaRedis na Prática
Redis na Prática
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Doctrine 2 camada de persistência para php
Doctrine 2   camada de persistência para phpDoctrine 2   camada de persistência para php
Doctrine 2 camada de persistência para php
 

Semelhante a Logs, pra que te quero! @ Meetup PHP Vale

Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017Gabriel Machado
 
Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019Gabriel Machado
 
Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Gabriel Machado
 
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPLabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPCarlos Santos
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Jonata Weber
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
E-book sobre HTML 5 (Devmedia)
E-book sobre HTML 5 (Devmedia)E-book sobre HTML 5 (Devmedia)
E-book sobre HTML 5 (Devmedia)Devmedia
 
Painel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGPainel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGiMasters
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Usando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpUsando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpbrunocf007
 

Semelhante a Logs, pra que te quero! @ Meetup PHP Vale (20)

Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
 
Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019
 
Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017
 
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPLabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)
 
Novidades do PHP 5.3 e 6
Novidades do PHP 5.3 e 6Novidades do PHP 5.3 e 6
Novidades do PHP 5.3 e 6
 
Minicurso Web. Front-end e HTML5 (parte 2)
Minicurso Web. Front-end e HTML5 (parte 2)Minicurso Web. Front-end e HTML5 (parte 2)
Minicurso Web. Front-end e HTML5 (parte 2)
 
TDC 2016 - PHP7
TDC 2016 - PHP7TDC 2016 - PHP7
TDC 2016 - PHP7
 
Python 08
Python 08Python 08
Python 08
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Tema 1 | Introdução a PHP
Tema 1 | Introdução a PHPTema 1 | Introdução a PHP
Tema 1 | Introdução a PHP
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
E-book sobre HTML 5 (Devmedia)
E-book sobre HTML 5 (Devmedia)E-book sobre HTML 5 (Devmedia)
E-book sobre HTML 5 (Devmedia)
 
Painel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGPainel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNG
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Zephir
ZephirZephir
Zephir
 
Usando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpUsando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para php
 

Mais de Gabriel Machado

GitHub Actions @ Oktober Cloud 2019
GitHub Actions @ Oktober Cloud 2019GitHub Actions @ Oktober Cloud 2019
GitHub Actions @ Oktober Cloud 2019Gabriel Machado
 
Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019
Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019
Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019Gabriel Machado
 
Pipelines de CI/CD com Azure @ Oktober Cloud
Pipelines de CI/CD com Azure @ Oktober CloudPipelines de CI/CD com Azure @ Oktober Cloud
Pipelines de CI/CD com Azure @ Oktober CloudGabriel Machado
 
Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Gabriel Machado
 
Symfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeSymfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeGabriel Machado
 
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018 O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018 Gabriel Machado
 
Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018
Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018
Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018Gabriel Machado
 
Logs no Laravel 5.6 @ 7masters Laravel
Logs no Laravel 5.6 @ 7masters LaravelLogs no Laravel 5.6 @ 7masters Laravel
Logs no Laravel 5.6 @ 7masters LaravelGabriel Machado
 
Relatórios gerenciais com MySQL @ 7Masters MySQL
Relatórios gerenciais com MySQL @ 7Masters MySQLRelatórios gerenciais com MySQL @ 7Masters MySQL
Relatórios gerenciais com MySQL @ 7Masters MySQLGabriel Machado
 
Novidades do Laravel 5.3 @ 11º Meetup Laravel SP
Novidades do Laravel 5.3 @ 11º Meetup Laravel SPNovidades do Laravel 5.3 @ 11º Meetup Laravel SP
Novidades do Laravel 5.3 @ 11º Meetup Laravel SPGabriel Machado
 

Mais de Gabriel Machado (10)

GitHub Actions @ Oktober Cloud 2019
GitHub Actions @ Oktober Cloud 2019GitHub Actions @ Oktober Cloud 2019
GitHub Actions @ Oktober Cloud 2019
 
Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019
Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019
Symfony Flex & Dependency Injection @ Symfony Live São Paulo 2019
 
Pipelines de CI/CD com Azure @ Oktober Cloud
Pipelines de CI/CD com Azure @ Oktober CloudPipelines de CI/CD com Azure @ Oktober Cloud
Pipelines de CI/CD com Azure @ Oktober Cloud
 
Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018
 
Symfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeSymfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPVale
 
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018 O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
 
Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018
Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018
Continuous Delivery com Docker, OpenShift e Jenkins @ TDC FLP 2018
 
Logs no Laravel 5.6 @ 7masters Laravel
Logs no Laravel 5.6 @ 7masters LaravelLogs no Laravel 5.6 @ 7masters Laravel
Logs no Laravel 5.6 @ 7masters Laravel
 
Relatórios gerenciais com MySQL @ 7Masters MySQL
Relatórios gerenciais com MySQL @ 7Masters MySQLRelatórios gerenciais com MySQL @ 7Masters MySQL
Relatórios gerenciais com MySQL @ 7Masters MySQL
 
Novidades do Laravel 5.3 @ 11º Meetup Laravel SP
Novidades do Laravel 5.3 @ 11º Meetup Laravel SPNovidades do Laravel 5.3 @ 11º Meetup Laravel SP
Novidades do Laravel 5.3 @ 11º Meetup Laravel SP
 

Logs, pra que te quero! @ Meetup PHP Vale

  • 1. Logs, pra que te quero! Meetup PHP Vale
  • 2. Gabriel Machado Autor dos cursos de cloud computing PHP, DevOps, Data gmsantos gmsantos__ gmsantos gmsantos Meetup PHP Vale
  • 3. O que são Logs? • “Quando o homem avançou o mar, na época dos grandes descobrimentos, para deixar registrado os eventos ocorridos durante a viagem foi comum a criação de um log, no sentido de ser um 'diário de bordo'.” - Wikipedia Meetup PHP Vale
  • 4. O que são Logs? Meetup PHP Vale
  • 5. O que são Logs? Meetup PHP Vale
  • 6. O que são Logs? Meetup PHP Vale
  • 7. O que são Logs? Meetup PHP Vale
  • 8. Características de um bom log Logs, pra que te quero! Meetup PHP Vale
  • 9. Ser claro e informativo // mensagens que não dizem nada [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 Meetup PHP Vale
  • 10. Ter contexto // 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 sobre o contexto [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} Meetup PHP Vale
  • 11. Fácil de pesquisar e agrupar // Repensar logs com mensagem dinâmica 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"]} Meetup PHP Vale
  • 12. Utilizar níveis de criticidade Meetup PHP Vale
  • 13. Analise seus logs • 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 Dashboards a partir dos seus logs Meetup PHP Vale
  • 14. PSR-3 Logs, pra que te quero! Meetup PHP Vale
  • 15. 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 Especificação da PSR-3 Meetup PHP Vale
  • 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) Meetup PHP Vale
  • 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) Meetup PHP Vale
  • 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 Meetup PHP Vale
  • 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) Meetup PHP Vale
  • 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 Meetup PHP Vale
  • 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) Meetup PHP Vale
  • 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 Meetup PHP Vale
  • 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 Meetup PHP Vale
  • 24. Monolog Logs, pra que te quero! Meetup PHP Vale
  • 25. Monolog • Criado por um dos criadores do Composer (@Seldaek) • Implementa 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 Meetup PHP Vale
  • 26. Monolog • Handlers • Destino do log • Formatters • Formato em que o log será enviado • Processors • Informações extras para o log Meetup PHP Vale
  • 27. Handlers • StreamHandler • RotatingFileHandler • SlackWebhookHandler • MandrillHandler • NewRelicHandler • LogEntriesHandler • NullHandler Meetup PHP Vale
  • 28. Formatters • LineFormatter • HtmlFormatter • JsonFormatter • ChromePHPFormatter • LogstashFormatter Meetup PHP Vale
  • 29. Processors • PsrLogMessageProcessor • IntrospectionProcessor • WebProcessor • MemoryPeakUsageProcessor • GitProcessor • TagProcessor Meetup PHP Vale
  • 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! [] [] Meetup PHP Vale
  • 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 [] [] Meetup PHP Vale
  • 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} Meetup PHP Vale
  • 33. Exemplos $data = ['user' => 'TDC']; $logger->info('User '. $data['user'] .' logged', $data); // without Psr Processor use MonologProcessorPsrLogMessageProcessor; $logger->info('User {user} logged', $data); // with Psr Processor // my_app.log: [2017-07-20 01:25:02] my_logger.INFO: User TDC logged {"user":"TDC"} [] [2017-07-20 01:25:02] my_logger.INFO: User TDC logged {"user":"TDC"} [] Meetup PHP Vale
  • 34. Exemplos $rotatingFileHandler = $logger->popHandler(); $fileHandler = $logger->popHandler(); $htmlHandler = new StreamHandler(__DIR__.'/log.html', Logger::DEBUG); use MonologFormatterLineFormatter; use MonologFormatterJsonFormatter; use MonologFormatterHtmlFormatter; $fileHandler->setFormatter(new LineFormatter("%level_name%: %message% %context% %extra%n")); $rotatingFileHandler->setFormatter(new JsonFormatter()); $htmlHandler->setFormatter(new HtmlFormatter()); $logger->setHandlers([$fileHandler, $rotatingFileHandler, $htmlHandler]); $logger->error('Unhandled Expection: Lorem ipsum', ['user' => 'locaweb']); $logger->critical('User {user} is trying to hack us!', ['id' => 666, 'user' => 'locaweb',]); Meetup PHP Vale
  • 35. Exemplos // my_app.log [2017-07-20 02:00:18] my_logger.INFO: User locaweb logged {"user":"locaweb "} [] ERROR: Unhandled Expection: Lorem ipsum {"user":"locaweb"} {"file":"/mnt/c/Users/gabri/Projects/tdc/bootstrap.php","line":51,"class":null,"function":n ull} CRITICAL: User locaweb is trying to hack us! {"id":666,"user":"locaweb "} {"file":"/mnt/c/Users/gabri/Projects/tdc/bootstrap.php","line":52,"class":null,"function":n ull} Meetup PHP Vale
  • 36. Exemplos // error-2017-07-20.log [2017-07-20 02:00:18] my_logger.ERROR: Error event [] [] {"message":"Unhandled Expection: Lorem ipsum","context":{"user":"locaweb"},"level":400,"level_name":"ERROR","channel":"my_logger", "datetime":{"date":"2017-07-20 02:00:18.608935","timezone_type":3,"timezone":"UTC"},"extra":{"file":"/mnt/c/Users/gabri/Pr ojects/tdc/bootstrap.php","line":51,"class":null,"function":null}} {"message":"User locaweb is trying to hack us!","context":{"id":666,"user":"locaweb"},"level":500,"level_name":"CRITICAL","channel":"m y_logger","datetime":{"date":"2017-07-20 02:00:18.610325","timezone_type":3,"timezone":"UTC"},"extra":{"file":"/mnt/c/Users/gabri/Pr ojects/tdc/bootstrap.php","line":52,"class":null,"function":null}} Meetup PHP Vale
  • 38. Como usar no seu projeto? Logs, pra que te quero! Meetup PHP Vale
  • 39. Projetos com suporte Monolog • Symfony • Laravel • Zend Framework * • Drupal * • Magento • Expressive * • Silex • Lumen Meetup PHP Vale
  • 40. Analisando os logs Logs, pra que te quero! Meetup PHP Vale
  • 41. Como visualizar? • Na sua maquina local, pode acessar diretamente o arquivo $ tail -f /path/to/log Meetup PHP Vale
  • 42. 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? Meetup PHP Vale
  • 43. 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 Meetup PHP Vale
  • 47. Exemplo: Dashboard para Queues do Laravel Logs, pra que te quero!
  • 48. 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, ]); }); }
  • 49.
  • 50.
  • 51. Resumindo... • Organize os logs gerados pela aplicação • Crie processos de revisão periódica dos logs • Automatize o envio de alertas • Centralize os logs da aplicação • Cruze com outros logs (servidor web, banco de dados) Meetup PHP Vale

Notas do Editor

  1. Podemos criar um provider que escuta alguns eventos da Queue e enviamos esse evento para um log... Aqui estou escutando os eventos de inicio do Job, job processado com sucesos ou erro na execução, juntamente com o erro que ocorreu E ao enviar isso para um serviço externo
  2. Podemos criar um dashboard bom informações sobre nosso sistema, como quantidade de Jobs durante o tempo, jobs que falharam
  3. Os tipos de Jobs em execução.. E assim vai..