SlideShare ist ein Scribd-Unternehmen logo
1 von 47
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

Weitere ähnliche Inhalte

Ähnlich wie 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 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
 
Capítulo 16 rsyslog
Capítulo 16   rsyslogCapítulo 16   rsyslog
Capítulo 16 rsyslogPaulo 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 à noiteComunidade 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 WebRildo Pragana
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPressRudá 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
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Luí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 2011Luí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: CakePHPThiago 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çãoArtur Felipe Sousa
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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

Hinweis der Redaktion

  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..