SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Implementando PSR-3 com
Monolog
PHP Community Summit 2019
Gabriel Machado
Autor dos cursos de cloud computing
PHP, DevOps, Data
gmsantos
gmsantos__
gmsantos
gmsantos
PHP Community Summit 2019
Requisitos
• Para aproveitar melhor esse workshop você vai precisar
• Notebook com acesso a internet
• Git
• Docker (para rodar um cluster ELK localmente)
• PHP 7.2+ recomendando, mínimo PHP 7.0
• Extensão do SQLite habilitada
• Composer
• Terminal
• Editor de código (VSCode)
PHP Community Summit 2019
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
PHP Community Summit 2019
O que são Logs?
PHP Community Summit 2019
O que são Logs?
PHP Community Summit 2019
O que são Logs?
PHP Community Summit 2019
O que são Logs?
PHP Community Summit 2019
Características de um bom log
Implementando PSR-3 com Monolog
PHP Community Summit 2019
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
PHP Community Summit 2019
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}
PHP Community Summit 2019
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"]}
PHP Community Summit 2019
Utilizar níveis de criticidade
PHP Community Summit 2019
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
PHP Community Summit 2019
PSR-3
Implementando PSR-3 com Monolog
PHP Community Summit 2019
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
PHP Community Summit 2019
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)
PHP Community Summit 2019
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)
PHP Community Summit 2019
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
PHP Community Summit 2019
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)
PHP Community Summit 2019
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
PHP Community Summit 2019
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)
PHP Community Summit 2019
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
PHP Community Summit 2019
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
PHP Community Summit 2019
Monolog
Implementando PSR-3 com Monolog
PHP Community Summit 2019
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
PHP Community Summit 2019
Monolog
• Handlers
• Destino do log
• Formatters
• Formato em que o log será enviado
• Processors
• Informações extras para o log
PHP Community Summit 2019
Handlers
• StreamHandler
• RotatingFileHandler
• SlackWebhookHandler
• MandrillHandler
• NewRelicHandler
• LogEntriesHandler
• NullHandler
PHP Community Summit 2019
Formatters
• LineFormatter
• HtmlFormatter
• JsonFormatter
• ChromePHPFormatter
• LogstashFormatter
PHP Community Summit 2019
Processors
• PsrLogMessageProcessor
• IntrospectionProcessor
• WebProcessor
• MemoryPeakUsageProcessor
• GitProcessor
• TagProcessor
PHP Community Summit 2019
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! [] []
PHP Community Summit 2019
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 [] []
PHP Community Summit 2019
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}
PHP Community Summit 2019
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"} []
PHP Community Summit 2019
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',]);
PHP Community Summit 2019
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}
PHP Community Summit 2019
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}}
PHP Community Summit 2019
Exemplos
PHP Community Summit 2019
Como usar no seu projeto?
Implementando PSR-3 com Monolog
PHP Community Summit 2019
Projetos com suporte Monolog
• Symfony
• Laravel
• Zend Framework *
• Drupal *
• Magento
• Expressive *
• Silex
• Lumen
PHP Community Summit 2019
Analisando os logs
Implementando PSR-3 com Monolog
PHP Community Summit 2019
Como visualizar?
• Na sua maquina local, pode acessar diretamente o arquivo
$ tail -f /path/to/log
PHP Community Summit 2019
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?
PHP Community Summit 2019
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
PHP Community Summit 2019
Serviços Externos
PHP Community Summit 2019
Integrando com ELK
Implementando PSR-3 com Monolog
PHP Community Summit 2019
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)
PHP Community Summit 2019
Obrigado!
gmsantos
gmsantos__
gmsantos
gmsantos
PHP Community Summit 2019

Mais conteúdo relacionado

Semelhante a Implementando PSR-3 com Monolog

Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScriptCarlos Santos
 
Arteccom Workshop Magento
Arteccom Workshop MagentoArteccom Workshop Magento
Arteccom Workshop MagentoThiago Verly
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkJaime Neto
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e MonitorizaçãoSAPO Sessions
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterEric Silva
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Giovanni Bassi
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPressRudá Almeida
 
Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Rodrigo Kono
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Aplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkAplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkFlávio Lisboa
 
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
 

Semelhante a Implementando PSR-3 com Monolog (20)

PHP Tools for Fast coding
PHP Tools for Fast codingPHP Tools for Fast coding
PHP Tools for Fast coding
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
Arteccom Workshop Magento
Arteccom Workshop MagentoArteccom Workshop Magento
Arteccom Workshop Magento
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
Let's log!
Let's log!Let's log!
Let's log!
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon Framework
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Aplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend FrameworkAplicações Profissionais para Internet com Zend Framework
Aplicações Profissionais para Internet com Zend Framework
 
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
 
Magento: Mitos vs Vantagens
Magento: Mitos vs VantagensMagento: Mitos vs Vantagens
Magento: Mitos vs Vantagens
 
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
 
Controle de versão e colaboração com Git
Controle de versão e colaboração com GitControle de versão e colaboração com Git
Controle de versão e colaboração com Git
 

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
 

Implementando PSR-3 com Monolog

  • 1. Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 2. Gabriel Machado Autor dos cursos de cloud computing PHP, DevOps, Data gmsantos gmsantos__ gmsantos gmsantos PHP Community Summit 2019
  • 3. Requisitos • Para aproveitar melhor esse workshop você vai precisar • Notebook com acesso a internet • Git • Docker (para rodar um cluster ELK localmente) • PHP 7.2+ recomendando, mínimo PHP 7.0 • Extensão do SQLite habilitada • Composer • Terminal • Editor de código (VSCode) PHP Community Summit 2019
  • 4. 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 PHP Community Summit 2019
  • 5. O que são Logs? PHP Community Summit 2019
  • 6. O que são Logs? PHP Community Summit 2019
  • 7. O que são Logs? PHP Community Summit 2019
  • 8. O que são Logs? PHP Community Summit 2019
  • 9. Características de um bom log Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 10. 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 PHP Community Summit 2019
  • 11. 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} PHP Community Summit 2019
  • 12. 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"]} PHP Community Summit 2019
  • 13. Utilizar níveis de criticidade PHP Community Summit 2019
  • 14. 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 PHP Community Summit 2019
  • 15. PSR-3 Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 16. 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 PHP Community Summit 2019
  • 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) PHP Community Summit 2019
  • 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) PHP Community Summit 2019
  • 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 PHP Community Summit 2019
  • 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) PHP Community Summit 2019
  • 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 PHP Community Summit 2019
  • 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) PHP Community Summit 2019
  • 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 PHP Community Summit 2019
  • 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 PHP Community Summit 2019
  • 25. Monolog Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 26. 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 PHP Community Summit 2019
  • 27. Monolog • Handlers • Destino do log • Formatters • Formato em que o log será enviado • Processors • Informações extras para o log PHP Community Summit 2019
  • 28. Handlers • StreamHandler • RotatingFileHandler • SlackWebhookHandler • MandrillHandler • NewRelicHandler • LogEntriesHandler • NullHandler PHP Community Summit 2019
  • 29. Formatters • LineFormatter • HtmlFormatter • JsonFormatter • ChromePHPFormatter • LogstashFormatter PHP Community Summit 2019
  • 30. Processors • PsrLogMessageProcessor • IntrospectionProcessor • WebProcessor • MemoryPeakUsageProcessor • GitProcessor • TagProcessor PHP Community Summit 2019
  • 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! [] [] PHP Community Summit 2019
  • 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 [] [] PHP Community Summit 2019
  • 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} PHP Community Summit 2019
  • 34. 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"} [] PHP Community Summit 2019
  • 35. 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',]); PHP Community Summit 2019
  • 36. 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} PHP Community Summit 2019
  • 37. 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}} PHP Community Summit 2019
  • 39. Como usar no seu projeto? Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 40. Projetos com suporte Monolog • Symfony • Laravel • Zend Framework * • Drupal * • Magento • Expressive * • Silex • Lumen PHP Community Summit 2019
  • 41. Analisando os logs Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 42. Como visualizar? • Na sua maquina local, pode acessar diretamente o arquivo $ tail -f /path/to/log PHP Community Summit 2019
  • 43. 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? PHP Community Summit 2019
  • 44. 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 PHP Community Summit 2019
  • 46. Integrando com ELK Implementando PSR-3 com Monolog PHP Community Summit 2019
  • 47. 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) PHP Community Summit 2019