SlideShare uma empresa Scribd logo
1 de 20
Édipo da Silva Souza
Pattern
"Patterns are formalized best practices that the programmer must implement
themselves in the application."
Introduction to Spring Framework (Acesso em: 25/09/2013)
http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/overview.html

Anti-Patterns
"Design anti-patterns are 'obvious, but wrong, solutions to recurring problems'."
Budgen, D. (2003). Software design. Harlow, Eng.: Addison-Wesley. p. 225. ISBN 0-20172219-4.

"...common approaches to solving recurring problems that prove to be ineffective. These
approaches are called antipatterns."
Scott W. Ambler (1998). Process patterns: building large-scale systems using object
technology. Cambridge, UK: Cambridge University Press. p. 4. ISBN 0-521-64568-9.


Error - Usado quando o processo não pode continuar. Considerados intoleráveis
pelo sistema.






Warn - Para eventos críticos, porem onde o processo pode continuar mas com
cuidados extras.






Null Pointer Exception
Banco de Dados indisponível
Falha com conexão remota

Utilizando cache por falta de conexão
Em modo administrador
Usuário sem senha.

Info - Deve permitir que administrador ou usuários avançados entendam
rapidamente o que a aplicação esta fazendo ou acabou de fazer.



Caixa de supermercado. "Caixa NºX" fechou uma compra no valor "R$Y“.
[Fulano] comprou uma passagem de [lugar X] para [lugar Y]


Debug - Elementos referentes a desenvolvimento, mas que podem ser
relevantes quando.






Valores recebidos ao entrar em um método
Valor de saída do método
Mudança de valor de variável

Trace - Informações detalhadas para o desenvolvedor. Recomendado utilizar
somente fora do ambiente de produção.



Valores de variável em determinados pontos
Log apenas para saber se tal linha executou


Informações legíveis para meros mortais
entenderem o que se passa.
 Anti-Pattern
log.debug(“Classe Beta1 lançou exceção 0x55”);

 Pattern
log.debug(“Classe UsuárioDAO lançou exceção senhaException”);



Não há necessidade de verificar se determinado
nível esta habilitado, o framework já faz isso.
Utilize apenas em conjunto com ‘else’, caso haja
a necessidade de sempre registrar algo.
 Anti-Pattern
if(log.isDebugEnabled())
log.debug(“Cliente registrado com sucesso.”);

 Pattern

if(log.isDebugEnabled())
log.debug(“Itens no checkout: {}”, compra.getItens());
else
log.info(“Nº de Itens no checkout: {}”, compra.getItens().size());
Ver Ex.


Certifique-se de não tentar registrar em seu
log um Null Pointer Exception
 Pattern
log.debug("Cliente com sobrenome: {}", cliente.getSobrenome());


Utilize sempre em um único log, informação
e valor
 Anti-Pattern
log.debug(“Cliente registrado com sucesso.”);
log.debug(cliente.getId());

 Pattern
log.debug(“Cliente registrado com sucesso: {}”, cliente.getId());

Ver Ex.





Registre informações fáceis para humano e
máquina lerem seus logs.
O separador utilizado também é importante
para facilitar o trabalho de um parser. Prefira
utilizar vírgulas ou tabs para separar valores
no log.
Evite utilizar mais de uma linha em um log.
 Pattern
log.debug(“Horário requisitado: {} ({})", new Date(ttl), ttl);
// Horário requisitado: Wed Apr 28 20:14:12 CEST 2010 (1272478452437)


Defina um padrão para seus logs
(Ex: data, level, thread, nome, mensagem)
 Pattern
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern>
</encoder>
</appender>
Exemplo de definição de padrão no LogBack.

Ver Ex.


Registrar parâmetros recebidos e valor de
retorno para métodos importantes.
 Pattern
public String fazerAlgo(String a, int b, double c){
log.debug("iniciando fazerAlgo com a={}, b={} e c={}, a, b, c);
//processa várias coisas
log.debug("saindo de fazerAlgo com {}", resultado);
}


Caso sua exceção não faça o tratamento e
apenas relançe aquela exceção, fazer log
pode resultar em stackTrace duplicado.
 Anti-Pattern
}catch (Exception e){
log.error("IO exception", e);
throw new MyCustomException(e);
}

Ver Ex.


Não instanciar logger passando a classe como
String.
 Anti-Pattern
private final static Logger LOGGER = LoggerFactory.getLogger("com.ess.Usuario");

 Pattern
private final static Logger LOGGER = LoggerFactory.getLogger(Usuario.class);


Não instanciar o logger dentro de cada método,
crie uma instancia somente para a classe toda.
 Anti-Pattern
public void metodo() {
Logger logger = LoggerFactory.getLogger(Foo.class);
logger.info(“ok!");
}

 Pattern

private final static Logger LOGGER = LoggerFactory.getLogger(Vai.class);

public void metodo() {
LOGGER.info(“ok");
}


Interagir com sistemas externos pode resultar
num objeto de tamanho inesperado. Quando
em produção evitar logs excessivos.
 Pattern
Collection< Usuario> usuarios = //...
if(log.isDebugEnabled())
log.debug(“Usuários: {}", usuarios );
else
log.info(" Usuários size: {}", usuarios.size());

Ver Ex.


Registre todo o stacktrace ao fazer um log
dentro de uma excessão.
 Anti-Pattern
} catch (Exception e) {
LOGGER.error(“Algo errado occurreu.");
// ou: LOGGER.error(e.getMessage());
}

 Pattern
} catch (Exception e) {
LOGGER.error(" Algo errado occurreu.", e);
// ou: LOGGER.error(e.getMessage(), e);
}




Camada abstrata de log é diferente de framework de
log, um framework normalmente implementa uma
camada abstrata de log.
Certifique-se fazer os import da camada abstrata, pois
caso precise trocar de framework não será preciso
modificar o código, basta substituir os arquivos jar.
 Anti-Pattern
import com.logback.Logger;
import com.logback.LoggerFactory;

 Pattern
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


Além de questões de armazenamento de
transferência de arquivos enormes, diferentes
usuários possuem diferentes necessidades,
principalmente em questões temporais.
 Suporte pode trabalhar melhor com logs semanais.
 Marketing poderia preferir logs diários para decisões

estratégicas ágeis.
 Contabilidade prefere manter logs anuais.
 Setor financeiro trabalha melhor com registros mensais.
 http://www.javacodegeeks.com/2011/01/10-tips-proper-application-

logging.html
 http://rolf-engelhard.de/2013/03/logging-anti-patterns-part-i/
 http://rolf-engelhard.de/2013/04/logging-anti-patterns-part-ii/
 http://gojko.net/2006/12/09/logging-anti-patterns/
“Um log difícil de ler e de interpretar é o
mesmo que log nenhum.”

Édipo S.S.
Fortaleza
2013

Mais conteúdo relacionado

Mais procurados

Programação defensiva
Programação defensivaProgramação defensiva
Programação defensivaKayo Rayner
 
Otimização, dicas de implementação, como resolver problemas by Adriano Santan...
Otimização, dicas de implementação, como resolver problemas by Adriano Santan...Otimização, dicas de implementação, como resolver problemas by Adriano Santan...
Otimização, dicas de implementação, como resolver problemas by Adriano Santan...iPhoneDevBr
 
Aprendendo e entendendo o ajax
Aprendendo e entendendo o ajaxAprendendo e entendendo o ajax
Aprendendo e entendendo o ajaxsonia carioca
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizadosThiago Ghisi
 
Mock it with mockito
Mock it with mockitoMock it with mockito
Mock it with mockitoRenan Uchôa
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
 
Realizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitosRealizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitosVIVIANE RANGEL
 
Construindo Sistemas Com Django
Construindo Sistemas Com DjangoConstruindo Sistemas Com Django
Construindo Sistemas Com DjangoMarinho Brandão
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7David Willian
 

Mais procurados (19)

Programação defensiva
Programação defensivaProgramação defensiva
Programação defensiva
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Otimização, dicas de implementação, como resolver problemas by Adriano Santan...
Otimização, dicas de implementação, como resolver problemas by Adriano Santan...Otimização, dicas de implementação, como resolver problemas by Adriano Santan...
Otimização, dicas de implementação, como resolver problemas by Adriano Santan...
 
Aprendendo e entendendo o ajax
Aprendendo e entendendo o ajaxAprendendo e entendendo o ajax
Aprendendo e entendendo o ajax
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
Mock it with mockito
Mock it with mockitoMock it with mockito
Mock it with mockito
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
Power mock
Power mockPower mock
Power mock
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por Testes
 
Testes de Sistema
Testes de SistemaTestes de Sistema
Testes de Sistema
 
JUnit
JUnitJUnit
JUnit
 
Realizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitosRealizando a gestão de testes e o controle de defeitos
Realizando a gestão de testes e o controle de defeitos
 
Java 12
Java 12Java 12
Java 12
 
JUnit Experience
JUnit ExperienceJUnit Experience
JUnit Experience
 
Testlink apresentacao
Testlink apresentacaoTestlink apresentacao
Testlink apresentacao
 
Fragmentos
FragmentosFragmentos
Fragmentos
 
Construindo Sistemas Com Django
Construindo Sistemas Com DjangoConstruindo Sistemas Com Django
Construindo Sistemas Com Django
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7
 

Destaque

Patterns para Windows Azure e Cloud Computing
Patterns para Windows Azure e Cloud ComputingPatterns para Windows Azure e Cloud Computing
Patterns para Windows Azure e Cloud ComputingVinicius Quaiato
 
TáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game Patterns
TáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game PatternsTáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game Patterns
TáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game PatternsLucas Mousinho
 
Orientação a Objetos e Design Patterns
Orientação a Objetos e Design PatternsOrientação a Objetos e Design Patterns
Orientação a Objetos e Design PatternsVinicius Quaiato
 
Soluções escaláveis com Microsoft Orleans e Windows Azure
Soluções escaláveis com Microsoft Orleans e Windows AzureSoluções escaláveis com Microsoft Orleans e Windows Azure
Soluções escaláveis com Microsoft Orleans e Windows AzureVinicius Quaiato
 
Universos Paralelos (saindo da zona de conforto)
Universos Paralelos (saindo da zona de conforto)Universos Paralelos (saindo da zona de conforto)
Universos Paralelos (saindo da zona de conforto)Vinicius Quaiato
 
Php Conf08 Enterprise Patterns
Php Conf08 Enterprise PatternsPhp Conf08 Enterprise Patterns
Php Conf08 Enterprise PatternsWildtech
 

Destaque (9)

Patterns para Windows Azure e Cloud Computing
Patterns para Windows Azure e Cloud ComputingPatterns para Windows Azure e Cloud Computing
Patterns para Windows Azure e Cloud Computing
 
TáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game Patterns
TáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game PatternsTáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game Patterns
TáSafo Conf 2015 - Boas práticas na implementação de um jogo: Game Patterns
 
Patterns, Padrões e Use Qualities
Patterns, Padrões e Use QualitiesPatterns, Padrões e Use Qualities
Patterns, Padrões e Use Qualities
 
Orientação a Objetos e Design Patterns
Orientação a Objetos e Design PatternsOrientação a Objetos e Design Patterns
Orientação a Objetos e Design Patterns
 
Soluções escaláveis com Microsoft Orleans e Windows Azure
Soluções escaláveis com Microsoft Orleans e Windows AzureSoluções escaláveis com Microsoft Orleans e Windows Azure
Soluções escaláveis com Microsoft Orleans e Windows Azure
 
Universos Paralelos (saindo da zona de conforto)
Universos Paralelos (saindo da zona de conforto)Universos Paralelos (saindo da zona de conforto)
Universos Paralelos (saindo da zona de conforto)
 
Php Conf08 Enterprise Patterns
Php Conf08 Enterprise PatternsPhp Conf08 Enterprise Patterns
Php Conf08 Enterprise Patterns
 
Azure WebJobs
Azure WebJobsAzure WebJobs
Azure WebJobs
 
Functional programming
Functional programmingFunctional programming
Functional programming
 

Semelhante a Logging Patterns & Anti-Patterns

1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPressRudá Almeida
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Apresentacao log
Apresentacao logApresentacao log
Apresentacao logpedrohfsd
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
 
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
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger daggertdc-globalcode
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Vanderson Silva
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
Android DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoAndroid DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoiMasters
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 

Semelhante a Logging Patterns & Anti-Patterns (20)

1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress1001 maneiras de debugar o WordPress
1001 maneiras de debugar o WordPress
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Aula1
Aula1Aula1
Aula1
 
Apresentacao log
Apresentacao logApresentacao log
Apresentacao log
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
 
Java 13 Excecoes
Java 13 ExcecoesJava 13 Excecoes
Java 13 Excecoes
 
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
 
Cs 2
Cs 2Cs 2
Cs 2
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Android DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimentoAndroid DevConference - Automatizando testes sem sofrimento
Android DevConference - Automatizando testes sem sofrimento
 
Apostila Visualg
Apostila VisualgApostila Visualg
Apostila Visualg
 
Log4net
Log4netLog4net
Log4net
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 

Mais de Édipo Souza

Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...Édipo Souza
 
Android, Gradle & Dependecies
Android, Gradle & DependeciesAndroid, Gradle & Dependecies
Android, Gradle & DependeciesÉdipo Souza
 
Android studio build variants
Android studio build variantsAndroid studio build variants
Android studio build variantsÉdipo Souza
 
Testing android apps with espresso
Testing android apps with espressoTesting android apps with espresso
Testing android apps with espressoÉdipo Souza
 
Next Step, Android Studio!
Next Step, Android Studio!Next Step, Android Studio!
Next Step, Android Studio!Édipo Souza
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma AndroidÉdipo Souza
 
Apresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias DigitaisApresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias DigitaisÉdipo Souza
 
UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...
UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...
UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...Édipo Souza
 
Android - Frameworks de Testes
Android - Frameworks de TestesAndroid - Frameworks de Testes
Android - Frameworks de TestesÉdipo Souza
 
Android - Frameworks para Gráficos
Android - Frameworks para GráficosAndroid - Frameworks para Gráficos
Android - Frameworks para GráficosÉdipo Souza
 
Android - Frameworks de Persistência
Android - Frameworks de PersistênciaAndroid - Frameworks de Persistência
Android - Frameworks de PersistênciaÉdipo Souza
 
Framework MVC - vRaptor
Framework MVC - vRaptorFramework MVC - vRaptor
Framework MVC - vRaptorÉdipo Souza
 
XP - eXtreme Programming
XP - eXtreme ProgrammingXP - eXtreme Programming
XP - eXtreme ProgrammingÉdipo Souza
 

Mais de Édipo Souza (13)

Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
 
Android, Gradle & Dependecies
Android, Gradle & DependeciesAndroid, Gradle & Dependecies
Android, Gradle & Dependecies
 
Android studio build variants
Android studio build variantsAndroid studio build variants
Android studio build variants
 
Testing android apps with espresso
Testing android apps with espressoTesting android apps with espresso
Testing android apps with espresso
 
Next Step, Android Studio!
Next Step, Android Studio!Next Step, Android Studio!
Next Step, Android Studio!
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma Android
 
Apresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias DigitaisApresentação de minha Monografia do curso de Sistema e Mídias Digitais
Apresentação de minha Monografia do curso de Sistema e Mídias Digitais
 
UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...
UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...
UMA ANÁLISE COMPARATIVA DE FERRAMENTAS DE DESENVOLVIMENTO MULTIPLATAFORMA PAR...
 
Android - Frameworks de Testes
Android - Frameworks de TestesAndroid - Frameworks de Testes
Android - Frameworks de Testes
 
Android - Frameworks para Gráficos
Android - Frameworks para GráficosAndroid - Frameworks para Gráficos
Android - Frameworks para Gráficos
 
Android - Frameworks de Persistência
Android - Frameworks de PersistênciaAndroid - Frameworks de Persistência
Android - Frameworks de Persistência
 
Framework MVC - vRaptor
Framework MVC - vRaptorFramework MVC - vRaptor
Framework MVC - vRaptor
 
XP - eXtreme Programming
XP - eXtreme ProgrammingXP - eXtreme Programming
XP - eXtreme Programming
 

Logging Patterns & Anti-Patterns

  • 2. Pattern "Patterns are formalized best practices that the programmer must implement themselves in the application." Introduction to Spring Framework (Acesso em: 25/09/2013) http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/overview.html Anti-Patterns "Design anti-patterns are 'obvious, but wrong, solutions to recurring problems'." Budgen, D. (2003). Software design. Harlow, Eng.: Addison-Wesley. p. 225. ISBN 0-20172219-4. "...common approaches to solving recurring problems that prove to be ineffective. These approaches are called antipatterns." Scott W. Ambler (1998). Process patterns: building large-scale systems using object technology. Cambridge, UK: Cambridge University Press. p. 4. ISBN 0-521-64568-9.
  • 3.  Error - Usado quando o processo não pode continuar. Considerados intoleráveis pelo sistema.     Warn - Para eventos críticos, porem onde o processo pode continuar mas com cuidados extras.     Null Pointer Exception Banco de Dados indisponível Falha com conexão remota Utilizando cache por falta de conexão Em modo administrador Usuário sem senha. Info - Deve permitir que administrador ou usuários avançados entendam rapidamente o que a aplicação esta fazendo ou acabou de fazer.   Caixa de supermercado. "Caixa NºX" fechou uma compra no valor "R$Y“. [Fulano] comprou uma passagem de [lugar X] para [lugar Y]
  • 4.  Debug - Elementos referentes a desenvolvimento, mas que podem ser relevantes quando.     Valores recebidos ao entrar em um método Valor de saída do método Mudança de valor de variável Trace - Informações detalhadas para o desenvolvedor. Recomendado utilizar somente fora do ambiente de produção.   Valores de variável em determinados pontos Log apenas para saber se tal linha executou
  • 5.  Informações legíveis para meros mortais entenderem o que se passa.  Anti-Pattern log.debug(“Classe Beta1 lançou exceção 0x55”);  Pattern log.debug(“Classe UsuárioDAO lançou exceção senhaException”);
  • 6.   Não há necessidade de verificar se determinado nível esta habilitado, o framework já faz isso. Utilize apenas em conjunto com ‘else’, caso haja a necessidade de sempre registrar algo.  Anti-Pattern if(log.isDebugEnabled()) log.debug(“Cliente registrado com sucesso.”);  Pattern if(log.isDebugEnabled()) log.debug(“Itens no checkout: {}”, compra.getItens()); else log.info(“Nº de Itens no checkout: {}”, compra.getItens().size()); Ver Ex.
  • 7.  Certifique-se de não tentar registrar em seu log um Null Pointer Exception  Pattern log.debug("Cliente com sobrenome: {}", cliente.getSobrenome());
  • 8.  Utilize sempre em um único log, informação e valor  Anti-Pattern log.debug(“Cliente registrado com sucesso.”); log.debug(cliente.getId());  Pattern log.debug(“Cliente registrado com sucesso: {}”, cliente.getId()); Ver Ex.
  • 9.    Registre informações fáceis para humano e máquina lerem seus logs. O separador utilizado também é importante para facilitar o trabalho de um parser. Prefira utilizar vírgulas ou tabs para separar valores no log. Evite utilizar mais de uma linha em um log.  Pattern log.debug(“Horário requisitado: {} ({})", new Date(ttl), ttl); // Horário requisitado: Wed Apr 28 20:14:12 CEST 2010 (1272478452437)
  • 10.  Defina um padrão para seus logs (Ex: data, level, thread, nome, mensagem)  Pattern <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern> </encoder> </appender> Exemplo de definição de padrão no LogBack. Ver Ex.
  • 11.  Registrar parâmetros recebidos e valor de retorno para métodos importantes.  Pattern public String fazerAlgo(String a, int b, double c){ log.debug("iniciando fazerAlgo com a={}, b={} e c={}, a, b, c); //processa várias coisas log.debug("saindo de fazerAlgo com {}", resultado); }
  • 12.  Caso sua exceção não faça o tratamento e apenas relançe aquela exceção, fazer log pode resultar em stackTrace duplicado.  Anti-Pattern }catch (Exception e){ log.error("IO exception", e); throw new MyCustomException(e); } Ver Ex.
  • 13.  Não instanciar logger passando a classe como String.  Anti-Pattern private final static Logger LOGGER = LoggerFactory.getLogger("com.ess.Usuario");  Pattern private final static Logger LOGGER = LoggerFactory.getLogger(Usuario.class);
  • 14.  Não instanciar o logger dentro de cada método, crie uma instancia somente para a classe toda.  Anti-Pattern public void metodo() { Logger logger = LoggerFactory.getLogger(Foo.class); logger.info(“ok!"); }  Pattern private final static Logger LOGGER = LoggerFactory.getLogger(Vai.class); public void metodo() { LOGGER.info(“ok"); }
  • 15.  Interagir com sistemas externos pode resultar num objeto de tamanho inesperado. Quando em produção evitar logs excessivos.  Pattern Collection< Usuario> usuarios = //... if(log.isDebugEnabled()) log.debug(“Usuários: {}", usuarios ); else log.info(" Usuários size: {}", usuarios.size()); Ver Ex.
  • 16.  Registre todo o stacktrace ao fazer um log dentro de uma excessão.  Anti-Pattern } catch (Exception e) { LOGGER.error(“Algo errado occurreu."); // ou: LOGGER.error(e.getMessage()); }  Pattern } catch (Exception e) { LOGGER.error(" Algo errado occurreu.", e); // ou: LOGGER.error(e.getMessage(), e); }
  • 17.   Camada abstrata de log é diferente de framework de log, um framework normalmente implementa uma camada abstrata de log. Certifique-se fazer os import da camada abstrata, pois caso precise trocar de framework não será preciso modificar o código, basta substituir os arquivos jar.  Anti-Pattern import com.logback.Logger; import com.logback.LoggerFactory;  Pattern import org.slf4j.Logger; import org.slf4j.LoggerFactory;
  • 18.  Além de questões de armazenamento de transferência de arquivos enormes, diferentes usuários possuem diferentes necessidades, principalmente em questões temporais.  Suporte pode trabalhar melhor com logs semanais.  Marketing poderia preferir logs diários para decisões estratégicas ágeis.  Contabilidade prefere manter logs anuais.  Setor financeiro trabalha melhor com registros mensais.
  • 19.  http://www.javacodegeeks.com/2011/01/10-tips-proper-application- logging.html  http://rolf-engelhard.de/2013/03/logging-anti-patterns-part-i/  http://rolf-engelhard.de/2013/04/logging-anti-patterns-part-ii/  http://gojko.net/2006/12/09/logging-anti-patterns/
  • 20. “Um log difícil de ler e de interpretar é o mesmo que log nenhum.” Édipo S.S. Fortaleza 2013