SlideShare uma empresa Scribd logo
Implementando PSR-3 com
Monolog
Gabriel Machado
Autor dos cursos de cloud computing
PHP e DevOps
gmsantos
gmsantos__
gmsantos
gmsantos
Conteúdo
• O que são logs?
• Como escrever um bom log
• PSR-3
• Monolog
• Analisando os logs
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
O que são Logs?
O que são Logs?
O que são Logs?
Como escrever um bom log
Implementando PSR-3 com Monolog
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
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}
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"]}
Implementar níveis de criticidade
PSR-3
Implementando PSR-3 com Monolog
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
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');
}
}
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)
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)
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
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)
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
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)
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
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
Monolog
Implementando PSR-3 com Monolog
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
Monolog
• Handlers
• Destino do log
• Formatters
• Formato em que o log será enviado
• Processors
• Informações extras para o log
Handlers
• StreamHandler
• RotatingFileHandler
• SlackWebhookHandler
• MandrillHandler
• NewRelicHandler
• LogEntriesHandler
• NullHandler
Formatters
• LineFormatter
• HtmlFormatter
• JsonFormatter
• ChromePHPFormatter
• LogstashFormatter
Processors
• PsrLogMessageProcessor
• IntrospectionProcessor
• WebProcessor
• MemoryPeakUsageProcessor
• GitProcessor
• TagProcessor
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! [] []
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 [] []
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}
Analisando os logs
Implementando PSR-3 com Monolog
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
Como visualizar?
• Na sua maquina local, pode acessar diretamente o arquivo
$ tail -f /path/to/log
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?
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
Serviços Externos
Sentry
Sentry
Exemplo: Dashboard para
Queues do Laravel
Implementando PSR-3 com Monolog
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 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
Obrigado!
gmsantos
gmsantos__
gmsantos
gmsantos

Mais conteúdo relacionado

Semelhante a Implementando PSR-3 com Monolog

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
Gabriel 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 2017
Gabriel Machado
 
Let's log!
Let's log!Let's log!
Let's log!
Elton Minetto
 
Capítulo 16 rsyslog
Capítulo 16   rsyslogCapítulo 16   rsyslog
Capítulo 16 rsyslog
Paulo Kutwak
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
Comunidade NetPonto
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
Rildo Pragana
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
Christiano Anderson
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress
Rudá Almeida
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)Carlos Santos
 
PHP Tools for Fast coding
PHP Tools for Fast codingPHP Tools for Fast coding
PHP Tools for Fast coding
Daniel Archer Marques Cramer
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011
Luís Cobucci
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
Apresentacao log
Apresentacao logApresentacao log
Apresentacao logpedrohfsd
 
Cake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCBA2012
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011
Luís Cobucci
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08Carlos Santos
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHP
Thiago Colares
 
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
tdc-globalcode
 
Django deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produçãoDjango deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produção
Artur Felipe Sousa
 

Semelhante a Implementando PSR-3 com Monolog (20)

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
 
Let's log!
Let's log!Let's log!
Let's log!
 
Capítulo 16 rsyslog
Capítulo 16   rsyslogCapítulo 16   rsyslog
Capítulo 16 rsyslog
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)
 
PHP Tools for Fast coding
PHP Tools for Fast codingPHP Tools for Fast coding
PHP Tools for Fast coding
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
Apresentacao log
Apresentacao logApresentacao log
Apresentacao log
 
Cake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modelo
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHP
 
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
 
Django deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produçãoDjango deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produção
 

Mais de Gabriel Machado

GitHub Actions @ Oktober Cloud 2019
GitHub Actions @ Oktober Cloud 2019GitHub Actions @ Oktober Cloud 2019
GitHub Actions @ Oktober Cloud 2019
Gabriel 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 2019
Gabriel 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 Cloud
Gabriel Machado
 
Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018Symfony Flex @ PHP Community Summit 2018
Symfony Flex @ PHP Community Summit 2018
Gabriel Machado
 
Symfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeSymfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPVale
Gabriel 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 2018
Gabriel 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 Laravel
Gabriel 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 MySQL
Gabriel 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 SP
Gabriel 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
 

Implementando PSR-3 com Monolog

  • 2. Gabriel Machado Autor dos cursos de cloud computing PHP e DevOps gmsantos gmsantos__ gmsantos gmsantos
  • 3. Conteúdo • O que são logs? • Como escrever um bom log • PSR-3 • Monolog • Analisando os logs
  • 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. O que são Logs?
  • 6. O que são Logs?
  • 7. O que são Logs?
  • 8. Como escrever um bom log Implementando PSR-3 com Monolog
  • 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. 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. 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. Implementar níveis de criticidade
  • 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.
  • 16. 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'); } }
  • 17. 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)
  • 18. 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)
  • 19. 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
  • 20. 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)
  • 21. 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
  • 22. 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)
  • 23. 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
  • 24. 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
  • 26. 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
  • 27. Monolog • Handlers • Destino do log • Formatters • Formato em que o log será enviado • Processors • Informações extras para o log
  • 28. Handlers • StreamHandler • RotatingFileHandler • SlackWebhookHandler • MandrillHandler • NewRelicHandler • LogEntriesHandler • NullHandler
  • 29. Formatters • LineFormatter • HtmlFormatter • JsonFormatter • ChromePHPFormatter • LogstashFormatter
  • 30. Processors • PsrLogMessageProcessor • IntrospectionProcessor • WebProcessor • MemoryPeakUsageProcessor • GitProcessor • TagProcessor
  • 31. 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! [] []
  • 32. 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 [] []
  • 33. 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}
  • 34. Analisando os logs Implementando PSR-3 com Monolog
  • 35. 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
  • 36. Como visualizar? • Na sua maquina local, pode acessar diretamente o arquivo $ tail -f /path/to/log
  • 37. 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?
  • 38. 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
  • 42. Exemplo: Dashboard para Queues do Laravel Implementando PSR-3 com Monolog
  • 43. 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, ]); }); }
  • 44.
  • 45.
  • 46. 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

Notas do Editor

  1. Ler definições e tal,
  2. 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
  3. Podemos criar um dashboard bom informações sobre nosso sistema, como quantidade de Jobs durante o tempo, jobs que falharam
  4. Os tipos de Jobs em execução.. E assim vai..