Slideshare.net (beta)

 
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons



All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 0 (more)

Logging

From gscheibel, 3 months ago

186 views  |  0 comments  |  0 favorites  |  3 downloads
 
 
 

Groups/Events

Not added to any group/event

 
 

Privacy InfoNew!

This slideshow is Public

 
Embed in your blog
Embed (wordpress.com)
custom

Slideshow Statistics
Total Views: 186
on Slideshare: 186
from embeds: 0* * Views from embeds since 21 Aug, 07

Slideshow transcript

Slide 1: Logging O valor e uso do log nas aplicações Tudo o que você achava que sabia sobre Log, mas nunca soube que não sabia – Rodrigo Cansian

Slide 2: Definição de Log A record, as of the performance of a machine or the progress of undertaking. Dictionary.com É um método de depuração de baixa tecnologia. Também pode ser vista como uma ferramenta de auditoria.

Slide 3: Por que Log é importante? É a maneira que a sua aplicação tem para contar ao pessoal de TI o que está acontecendo dentro do código. Os desenvolvedores precisam de informação de depuração durante o desenvolvimento. O pessoal de suporte precisa de informação quando ocorre um erro. O pessoal de produção precisa de informação para melhorar o uso dos recursos utilizados afim de melhorar a performance.

Slide 4: O Valor do Log Programadores usam debuggers ou loggers? Logging é mais rápido que um debugging. O logging é possível de ser utilizado no 'campo'. Debug é de difícil utilização num ambiente de computação distribuída. “Debug é Transiente, Log é Persistente” - Ceki Gülkü

Slide 5: Tipos de Logging Costuma-se utilizar o sistema de logging para: Tracing. Debugging. Error Handling. Logging. O problema principal é categorizar os comandos de logging.

Slide 6: O que deve ser logado? Fluxo do programa. Detalhes do que ocorre dentro de um método. Informações sobre um erro que ocorreu. Eventos ou histórico de negócio. Deve-se ter o cuidado de não gerar dados em excesso, pois causa o efeito 'scrolling blindness'.

Slide 7: System.out.println Performance ruim. Logging “Tudo ou Nada”. Necessita constante recompilação. Mais código para manter!!!!

Slide 8: System.out.println - Ex. if (x > 5) { System.out.println(“Entrei no if”); System.out.printn(“O valor do x eh ” + x); } else { System.out.println(“Essa droga não funciona”); System.out.println(“O valor de x não deveria ser ” + x); }

Slide 9: System.out.println – Ex. melhor public static final log = true; /* mudar para false e recompilar antes de enviar pro cliente!!!!!*/ if (x > 5) { if (log) { System.out.println(“Entrei no if”); System.out.printn(“O valor do x eh ” + x); } } else if (log) { System.out.println(“Essa droga continua não funcionando”);}

Slide 10: Características Básicas de um Sistema de Logging Controle sobre quais comandos de log estão habilitados ou não. Administração de destinos de saída. Administração de formato de saída.

Slide 11: Soluções de Logging em Java J.U.L. – java.util.logging (JSR#47) Apache Log4J Jakarta Commons Logging Existem diversas outras: jLo, MonoLog, LumberJack, Huston, JTraceDump, QFLog, LN2, ...

Slide 12: Logging J.U.L - java.util.logging

Slide 13: J.U.L. - java.util.logging Baseado na JSR 47. É parte do J2SE a partir da versão 1.4. Desenhada para ser o mais leve possível. O LumberJack implementa a especifícação nas versões anteriores do Java.

Slide 14: JSR 47: Logging API Specification Deverá ser possível habilitar/desabilitar o log durante a execução. Deverá ser possível controlar a granulariedade do log. Poderão ser registrados serviços de terceiros. Poderá conectar a serviços de log já existentes. Deverá suportar mensagens de alta prioridade.

Slide 15: Estrutura do J.U.L. Logger Levels Handler Filter Formatter

Slide 16: Logger São entidades nomeadas usando nomes separados por pontos. Cria a estrutura hierarquica do log. com.foo.bar com foo bar

Slide 17: Levels FINEST: o maior nível de detalhamento. FINER: nível maior ainda de detalhe. FINE: grande nível de detalhe. CONFIG: mensagens sobre configuração/setup. INFO: mensagens informativas. WARNING: mensagens de aviso. SEVERE: mensagens muito importantes. ALL e OFF: levels adicionais.

Slide 18: Handler Administra a saída do log. Handlers padrões: StreamHandler: escreve num OutputStream. ConsoleHandler: escreve no System.err. FileHandler: escreve num arquivo simples ou de rotação. SocketHandler: escreve em portas remotas TCP. MemoryHandler: escreve num buffer em memória.

Slide 19: Filter Interface para que o desenvolvedor possa criar filtros de log. Cada Logger e Handler pode ter um filtro associado. Especifica apenas um método: boolean isLoggable(LogRecord record)

Slide 20: Formatters Formatam os logs gerados. SimpleFormatter: formata um resumo “human- readable”. XMLFormatter: formata as saídas de maneira detalhada e no formato XML.

Slide 21: Exemplo import java.util.logging.Logger; public class Teste2 { public static void main(String[] args) throws Exception { Logger log = Logger.getLogger("Teste2"); log.finest("Teste1"); log.finer("Teste2"); log.fine("Teste3"); log.config("Teste4"); log.info("Teste5"); log.warning("Teste5"); log.severe("Teste5"); } }

Slide 22: Logging Apache Log4J

Slide 23: Apache Log4J Inicialmente criado pela IBM. Atualmente um projeto Apache com porte para diversas tecnologias. Seus objetivos são velocidade e flexibilidade (nesta ordem).

Slide 24: Log4J - Portes Log4Cxx Log4Cplus Log4Cpp Log4Net (.Net Framework) Log4PHP Log4Perl Log4PL/Sql

Slide 25: Custo do Log4J Quando o log é desligado totalmente ou permanecendo ativo para um pequeno grupo de prioridades, o custo é de apenas uma invocação de método, seguida de uma comparação de inteiros. Num Pentium II 233Mz este custo é entre 5 a 50 nanosegundos. O custo médio de um log com formatação e IO no mesmo ambiente é de 100 a 300 microsegundos.

Slide 26: O Custo Escondido O Java antes de invocar um método, primeiro avalia os seus parâmetros. ex: log.debug(“O valor de X:” + X + “, e o resultado da soma eh:” this.soma(x,y)); O Log4J fornece um método para evitar isto: if (log.isDebugEnable()) { log.debug(“O valor de X:” + X + “, e o resultado da soma eh:” this.soma(x,y)); }

Slide 27: Estrutura do Log4J Logger Level Appenders Layouts ObjectRenderes Filters

Slide 28: Loggers São Entidades que seguem a regra hierárquica (árvore) de seus nomes. Coração do Log4J. Antes conhecido como Category. Permite utilizar a estrutura de pacotes das classes como estrutura de Loggers. com.foo.bar com foo bar

Slide 29: Levels DEBUG: maior quantidade de informações. INFO: informações úteis. WARN: Avisos não impactantes. ERROR: Erros de execução. FATAL: Erro abortivo.

Slide 30: Appenders Objetos que concatenam o Log numa saída definida. Múltiplos appenders podem ser conectados a um Logger. Appenders pré-definidos: Telnet, Console, Files (DaylingRolling, SizeRolling), Unix Syslog, JMS, NT Event Log, SMTP, java.io.Writer

Slide 31: Layouts Formata um evento de log de acordo com a classe utilizada. Layouts padrão: TTCCLayout: Time, Thread, Category, Context HTMLLayout: Html Table PatternLayout: baseando num formato de conversão SimpleLayout: Level “-” mensagem XMLLayout: xml baseado no log4j.dtd

Slide 32: Object Renderer “Renderiza” um determinado objeto para texto, de acordo com a sua classe ao invés de chamar o método toString(). Armazenados no RendererMap. Renderers Padrão: ThreadGroupRenderer MessageRenderer (JMS) AttributesRenderer (SAX)

Slide 33: Filters Inspirado no Linux IPChains. O método decide deve retornar um dos três valores: DENY NEUTRAL ACCEPT Filtros padrões: DenyAllFilter, LevelMatchFilter, LevelRangeFilter, StringMatchFilter.

Slide 34: Configurando o Log4J Default: log4j.properties log4j.rootLogger=INFO, A1 log4j.logger.test=DEBUG, A2 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n log4j.appender.A2=org.apache.log4j.FileAppender log4j.appender.A2.File=teste.html log4j.appender.A2.layout=org.apache.log4j.HTMLLayout

Slide 35: Exemplo package test; import org.apache.log4j.Logger; public class Teste2 { public static void main(String[] args) throws Exception { Logger log = Logger.getLogger(Teste1.class); log.debug("Teste1"); log.info("Teste2"); log.warn("Teste3"); log.error("Teste4"); log.fatal("Teste5"); } }

Slide 36: Criando um Appender Vamos utilizar como exemplo o conceito de Instant Logging: Ao ocorrer um evento de erro, o administrador do sistema será avisado via um serviço de Instant Message. Como o MSN está bem popular, vamos utilizá-lo. Um outro exemplo: Instant Logging com o Jabber no site da IBM: http://www-106.ibm.com/developerworks/java/library/j- instlog/

Slide 37: Arquitetura

Slide 38: Receita Ingredientes: Log4J API. Uma Api de acesso ao msn. Vamos usar a JMSN. http://jmsn.sourceforge.net Para isto vamos um appender através de uma subclasse da classe AppenderSkeleton, e nela vamos sobrescrever o método append.

Slide 39: IMAppender public class IMAppender extends AppenderSkeleton { private MSNMessenger msn; private String usr; private String pass; public void activateOptions() { this.msn = new MSNMessenger(this.usr, this.pass); this.msn.login(); }

Slide 40: IMAppender public void append(LoggingEvent event) { if (!this.closed) { SwitchboardSession ss = null; String msg = event.getRenderedMessage(); MimeMessage mm = new MimeMessage(msg); mm.setKind(MimeMessage.KIND_MESSAGE); BuddyGroup bg = this.msn.getBuddyGroup(); BuddyList bl = bg.getAllowList(); Iterator i = bl.iterator(); while (i.hasNext()) { MsnFriend mf = (MsnFriend) i.next();

Slide 41: IMAppender if (!mf.getStatus().equals(UserStatus.OFFLINE)) { try { ss = this.msn.findSwitchboardSessionAt(mf.getLoginName()); if (ss == null) ss = this.msn.doCallWait(mf.getLoginName()); this.msn.sendMessage(mm, ss); } catch (Exception e) { }}}}}

Slide 42: IMAppender public boolean requiresLayout() { return false;} public void close() { this.msn.logout();} public void setUsr(String usr) { this.usr = usr;} public void setPass(String pass) { this.pass = pass;} }

Slide 43: Logging J.U.L. – java.util.logging X Apache Log4J

Slide 44: Log4J X J.U.L. É comum ao iniciar um novo projeto nos perguntarmos qual usar? Devo ficar com o fonte dependendo de uma API?

Slide 45: Por que J.U.L. Faz parte da Core API do Java 1.4.+. Não necessita de bibliotecas externas.

Slide 46: Por que Log4J? Tem as funcionalidades que o J.U.L. possui e diversas outras. Fácil utilização e extensão. Otimizado para velocidade. Mais usado == Mais robusto. Free e OpenSource. Utilizável no java 1.1.

Slide 47: Logging Jakarta Commons Logging

Slide 48: Jakarta Commons Logging Ponte 'ultra-thin' para os diferentes mecanismos de log. Usado para remover a dependência da aplicação de um determinado log. Provê wrappers para: Log4J J.U.L. Factory Pattern. A declaração de paz.

Slide 49: J.C.L. Factory 1) Procura pelo atributo ou propriedade do sistema org.apache.commons.logging.Log. 2) Se a API do Log4J está disponível no classpath, utiliza-se o Log4JLogger. 3) Se a aplicação estiver rodando sobre o Java 1.4+, utiliza-se o Jdk14Logger. 4) Se chegou até aqui, utiliza-se o log simples SimpleLog.

Slide 50: Exemplo J.C.L. package test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Teste3 { public static void main(String[] args) { Log log = LogFactory.getLog(Teste3.class); log.trace("Teste1"); log.debug("Teste2"); log.info("Teste3"); log.warn("Teste4"); log.error("Teste5"); log.fatal("Teste6");}}

Slide 51: Links J.U.L. java.util.looging http://java.sun.com/j2se/1.5.0/docs/guide/logging/ Apache Log4J http://logging.apache.org/log4j/ Jakarta Commons Logging http://jakarta.apache.org/commons/logging/ LumberJack http://javalogging.sourceforge.net/

Slide 52: Logging Muito obrigado por me ouvirem!