Anotações
Apresentação de slides
Estrutura de tópicos
1
Modulo IIa
Extra: Logging

  • Professor
  • Ismael H F Santos – ismael@tecgraf.puc-rio.br
2
Bibliografia
  • Linguagem de Programação JAVA
    •  Ismael H. F. Santos, Apostila UniverCidade, 2002
  • The Java Tutorial: A practical guide for programmers
    •  Tutorial on-line: http://java.sun.com/docs/books/tutorial
  • Java in a Nutshell
    •  David Flanagan, O´Reilly & Associates
  • Just Java 2
    •  Mark C. Chan, Steven W. Griffith e Anthony F. Iasi, Makron Books.
  • Java 1.2
    •  Laura Lemay & Rogers Cadenhead, Editora Campos
3
Bibliografia
4
Ementa
  • Princípios e Padrões de Projeto de SW
    • Ferramenta para construção de Aplicações - Ant
    • Logging
    • Classe Object
    • Documentação de código com JavaDOC



5
POO-Java
6
O que é o Ant?
7
Para que serve ?
8
Como funciona
9
Como funciona
10
Buildfile
11
Buildfile
12
Exemplo
13
Dependências
14
Tarefas Condicionadas
15
O que se pode fazer com Ant ?
16
Tarefas úteis
17
Tarefas úteis
18
Tipos de Dados
19
Mais tarefas úteis
20
Propriedades
21
Propriedades especiais
22
Mais tipos de dados
23
Ainda mais tipos de dados ....
24
Tipos de dados: seletores
25
Tipos de dados: filtros
26
Tarefas úteis para Execução
27
Tarefas úteis para J2EE
28
Tarefas úteis para extensão XDoclet
29
Tarefas úteis para Rede
30
Tarefas úteis para XSLT
31
Tarefas úteis para JDBC
32
Tarefas úteis para chamadas externas
33
Efeitos Sonoros
34
usando extensão XML
35
Gerenciando projetos com Ant
36
Targets Básicos do build.xml
37
Exemplo de Projeto
38
Construindo aplicações com Ant
39
Aplicação Gráfica Executável com Ant
40
Buildfile para aplicação Web
41
Buildfile para RMI-IIOP
42
Buildfile para aplicação EJB
43
Buildfile para transformação XSL
44
Ant Programável
45
Ant Programável – Exemplo
46
Ant Programável – Exemplo
47
Integração com outras aplicações
48
Integração com outros IDEs
49
Integração com JEdit
50
Conclusões
51
Exercício
52
Exercício - Diagrama
53
POO-Java
54
Logging
55
Logging
  • Logging: manutenção do registro do comportamento de uma aplicação.


  • Por que realizar logging?
    • Mensagens de log podem ajudar na depuração da aplicação.
    • Mensagens de log fornecem o contexto da execução de uma aplicação
56
Logging
  • Quando utilizar logging?
    • Na fase de desenvolvimento: para depurar a aplicação.
      • O que houver de errado? Onde ocorreu? Por que ocorreu?
    • Na fase de produção: ajuda a resolver problemas de execução.


  • (Desvantagem) instruções de log têm o potencial de aumentar o tamanho do executável e de reduzir a velocidade da aplicação.
57
O componente Logger
  • O ponto de entrada para o logging é um objeto Logger.
  • Criamos um objeto dessa classe e requisitamos a ele que faça o log de mensagens.
  • Há diversos métodos de log (i.e., métodos que aceitam como argumento uma mensagem de log) existentes em Logger.
  • Além disso, todo objeto da classe Logger possui duas propriedades importantes:
    • Seu nível
    • Seu nome
58
"The JavaTM Logging APIs -..."
  • The JavaTM Logging APIs - package java.util.logging,
    • software servicing and maintenance at customer sites producing log reports suitable for analysis by end users, system administrators, field service engineers, and software development teams
  •  The Logging APIs capture information such as
    • security failures,
    • configuration errors,
    • performance bottlenecks,
    • and/or bugs in the application or platform

59
Logging – Control Flow
60
Logging architecture
  • Applications make logging calls on Logger objects.  Logger objects allocate LogRecord objects which are passed to Handler objects for publication
  • Handlers may use logging Levels and (optionally) Filters to decide if they are interested in a particular LogRecord
  • Handler can (optionally) use a Formatter to localize and format the message before publishing it to an I/O stream


61
Logging
  • Loggers are named entities, using dot-separated names, namespace is hierarchical and is managed by the LogManager
  • The namespace should typically be aligned with the Java packaging namespace
  • Loggers keep track of their parent loggers in the logging namespace,
  • Loggers may inherit various attributes from their parents in the logger namespace
    • Logging level. If a Logger's level is set to be null then the Logger will use an effective Level that will be obtained by walking up the parent tree and using the first non-null Level.
    • Handlers. By default a Logger will log any output messages to its parent's handlers, and so on recursively up the tree. But Loggers may also be configured to ignore Handlers higher up the tree. (useParentHandlers=false)
    • Resource bundle names. If a logger has a null resource bundle name, then it will inherit any resource bundle name defined for its parent, and so on recursively up the tree.

62
Níveis de Severidade
63
POO-Java
64
Configuracao
65
Configuracao Declarative
66
POO-Java
67
Log4j
  • Log4j é um projeto de código aberto (open source) que permite ao desenvolvedor incluir logging em sua aplicação.
    • http://logging.apache.org
  • Fornece serviços de logging para auditoria e depuração de aplicações.
  • Com o Log4j, podemos ativar e desativar o logging sem a necessidade de modificar os binários da aplicação.
    • Isso pode ser controlado apenas editando um arquivo de configuração (detalhes mais adiante).
68
Log4j
  • Permite o controle dinâmico de:
    • Destino da saída de log (email, console, SGBD, arquivo do SO, servidores de log, etc.)
    • Que informação deve ser registrada
    • Formatação da saída (texto, HTML, XML, etc)
  • Foi implementado para outras linguagens além de Java:
    • C, C++, C#, Perl, Python, Ruby e Eiffel
69
Instalação do Log4j
  • A versão atual do Log4J pode ser encontrada em
    • http://logging.apache.org/log4j/docs/download.html
    • disponíveis o código fonte e as bibliotecas (.jar)
  • Faça a descompactação dos arquivos para alguma pasta.
  • Adicione a biblioteca (.jar) do log4J no classpath da aplicação.
    • Nome do arquivo da biblioteca: log4j-xxx.jar (onde xxx é a versão).
70
Componentes do Log4J
  • A API do Log4j tem os seguintes componentes principais:
    • Logger (classe)
    • Appender (interface)
    • Layout (classe)
  • Há também componentes acessórios (auxiliares):
    • Level
    • PropertyConfigurator, DOMConfigurator
  • Vamos agora detalhar esses componentes...
71
Logger
72
Nível de um Logger
  • O nível de um objeto logger determina que mensagens de log são realmente consideradas por este objeto.
    • Mensagens com nível igual ou mais alto que o nível definido para o logger são enviadas para a saída.
  • Há 8 níveis, definidos como constantes (inteiras) na classe Level (também do log4j):
    • DEBUG < INFO < WARN < ERROR < FATAL
    • ALL (nível mais baixo) e OFF (nível mais alto)
  • Um logger pode ser definido em um desses níveis
    • O método setLevel permite definir o nível do logger.


73
Método setLevel - exemplo
  • O Log4j registra uma mensagem sse o método de log utilizado corresponde a um nível que é igual ou maior que o nível do logger.


  • Exemplo:
74
Métodos de log
  • Método de log = método chamado quando desejamos registrar uma mensagem no log na aplicação.
  • São os métodos de log existentes na classes Logger são: debug, info, warn, error e fatal.
  • Cada um desses métodos está associado a um nível, correspondente ao seu nome.
    • e.g., logger.info(“Servidor Levantado") é uma requisição de log no nível INFO.
75
Métodos de log
  • Habilitação versus desabilitação
    • Diz-se que uma mensagem de log está habilitada se o nível do método de log utilizado for maior ou igual ao nível do logger.
    • Do contrário, diz-se que a mensagem está desabilitada.
76
Métodos de log - exemplo
77
Exemplo Logging
78
Uso dos métodos de log - Melhores Práticas
  • Use debug para mensagens de depuração, que não devem ser gravadas quando a aplicação estiver em produção.
  • Use info para mensagens similares ao modo "verbose".
  • Use warn para avisos, que são gravados em algum lugar. Avisos não devem corresponder a situações em que a aplicação deve parar de executar.
  • Use error para mensagens que são registradas por conta de algum erro recuperável da aplicação.
  • Use fatal para mensagens críticas; após a gravação das mesmas, a aplicação deve ser abortada.
79
Nome de um Logger
  • O padrão de nomenclatura para objetos da classe Logger é semelhante ao encontrado para classes em Java.
    • (i.e. com.pdxinc é “pai” de com.pdxinc.nhinar)
  • Prática normalmente utilizada: aproveitar o nome de uma classe como o nome do seu logger.
80
Appenders
  • No log4j, Appender é uma interface que representa o destinatário da saída do log.


  • Um logger pode ter vários appenders associados a ele.
    • Ou seja, o Log4j permite que uma requisição de log seja enviada para mais de um objeto que implemente Appender.
81
Appenders
  • O método addAppender da classe Logger adiciona um objeto Appender a um certo logger.


  • Há diversas classes que implementam a interface Appender...
82
Classes que implementam Appender
  • ConsoleAppender: envia requisições de log para a saída padrão (System.out ou System.err).
  • FileAppender: envia requisições de log para um arquivo
  • RollingFileAppender
    • subclasse de FileAppender,
    • pode fazer um backup do arquivo sempre que ele atingir um determinado tamanho.
83
Classes que implementam Appender (cont)
  • DailyRollingFileAppender
    • subclasse de FileAppender,
    • pode fazer um backup de tempos em tempos (e.g, a cada semana).
  • SMTPAppender - appender para enviar o log para um destinatário de e-mail


  • SocketAppender - envia os eventos de log para um servidor de logs remoto através do protocolo TCP.
84
Classes que implementam Appender (cont)
  • NTEventLogAppender - envia para o sistema de log de uma máquina com plataforma Windows.
  • SyslogAppender - envia os logs para um daemon (monitor de logs) remoto
  • JMSAppender - envia os logs como uma mensagem JMS
  • AsyncAppender - possibilita que os logs sejam coletados em um buffer e depois enviados para um ou mais appender anexados a ele.
85
ConsoleAppender - exemplo
86
FileAppender - exemplo
87
Layouts
  • Além de registrar mensagens de log, o Log4j pode também registrar:
    • Instante (data e hora) em que o log  foi requisitado,
    • Prioridade da mensagem (DEBUG, WARN, FATAL etc.),
    • Nome da classe, nome do método, número da linha no código fonte, onde o log foi requisitado,
    • etc
  • O formato do que é registrado em log é especificado no layout ao qual o appender é associado.
  • Um appender deve ter um Layout associado.
  • Layout é a classe base do Log4j responsável pela formatação da saída para um certo objeto Appender.
    • Classes do Log4j que especificam a formação estendem Layout
88
Subclasses de Layout
  • Há no log4j diversas subclasses de Layout predefinidas:
    • SimpleLayout: imprime o nível, o símbolo '-' e a mensagem de log.
    • HTMLLayout formata a saída como HTML.
    • XMLLayout formata a saída como XML.
    • PatternLayout formata                                                     a saída usando um                                                  padrão de                                               conversão.
    • DateLayout
89
SimpleLayout - exemplo
90
PatternLayout - exemplo
91
POO-Java
92
Hello Log4j
  • import org.apache.log4j.*;
  • public class HelloLog4j
  • {
    • private static Logger logger = Logger.getLogger(HelloLog4j.class);
  •   public static void main(String[] args)
  •   {
    • BasicConfigurator.configure();
    • logger.debug(“In the main method");
    • logger.info("What a beautiful day.");
    • logger.error(“This is an error message.”);
  •   }
  • }
93
Output from HelloLog4j
  • 0 [main] DEBUG HelloLog4j  - In the main method
  • 0 [main] INFO HelloLog4j  - What a beautiful day.
  • 10 [main] ERROR HelloLog4j  - This is an error message.
94
Hello java.util.logging
  • import java.util.logging.*;
  • public class HelloJDKLogging
  • {
  •     private static Logger logger =
  •       Logger.getLogger("com. foo.HelloJDKLogging");
  •     public static void main(String argv[])
  • {
  •         logger.setLevel(Level.ALL);
    •   logger.fine(“Program started");
    •   logger.info(“This app uses java.util.logging”);
    •   logger.warning(“Oops, I did it again");
    • }
  • }
95
Output from HelloJDKLogging
  • Jul 23, 2002 12:12:43 PM HelloJDKLogging main
  • INFO: This app uses java.util.logging
  • Jul 23, 2002 12:12:43 PM HelloJDKLogging main
  • WARNING: Oops, I did it again
96
Comparison:
log4j & java.util.logging
97
Level
98
Log4j Appender’s
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • JMSAppender
  • NTEventLogAppender


99
java.util.logging Handlers & Formaters
  • Handlers
    • StreamHandler
    • ConsoleHandler
    • FileHandler
    • SocketHandler
    • MemoryHandler
  • Formaters
    • SimpleFormatter
    • XMLFormatter
100
Logging: Best and Worst practices
  • Best Practices
    • use the appropriate message level
    • roll your log files daily / weekly
    • review your error log on a daily basis
  • Worst Practices
    • System.out.println / System.err.println
    • logging passwords to a log file
    • logging informational messages to STDERR
    • logging a message for every single HTTP request
    • multiple applications sending log messages to a single log file
    • ignoring error messages that appear in your application error log
    • misleading log message
101
JSE Logging x Log4j
  • The primary weakness of JDK Logging over Log4J is that the JDKs configuration file isn't as robust, but it does provide a mechanism to punt down in to classes to do arbitrary work rather than having a more rich configuration file format
  • Property "config". This property is intended to allow arbitrary configuration code to be run. The property defines a whitespace separated list of class names. A new instance will be created for each named class. The default constructor of each class may execute arbitrary code to update the logging configuration, such as setting logger levels, adding handlers, adding filters, etc


102
POO-Java
103
Configuração do log4j por arquivo
  • As configurações do log4j não devem ser feitas no código fonte.
    • Isso porque é desejável mudar as opções de logging ser ter que recompilar a aplicação.
  • Modo adequado: através de um arquivo de configuração.
  • Há dois modos de especificar o arquivo de configuração:
    • Arquivo de propriedades (PropertyConfigurator)
    • Arquivo XML (DOMConfigurator)
104
PropertyConfigurator - exemplo
  • Considere o seguinte arquivo de propriedades:
105
PropertyConfigurator – exemplo (cont.)
  • Considere que o arquivo de propriedades anterior foi passado como argumento para o programa a seguir:
106
PropertyConfigurator – exemplo (cont.)
  • O arquivo de log criado a partir do programa anterior:
    • Terá o nome HTMLLayout.html,
    • Terá como conteúdo uma tabela HTML com as mensagens de log em cada linha da tabela.
    • Para cada mensagem, terá:
      • o tempo (em milisegundos) decorrido desde quando o programa foi iniciado,
      • a thread que disparou o log,
      • o nível de prioridade,
      • (se LocationInfo = true) a classe, o nome do arquivo *.java desta classe e o número da linha,
      • a mensagem de log propriamente dita.

107
Customizações com PatternLayout
  • r - número de milissegundos transcorridos desde o início do programa
  • t - nome da thread que gerou o evento de log
  • p - prioridade (o -5 indica que deve alinhar à direita se o número de caracteres for menor que cinco)
108
Customizações com PatternLayout
  • c - nome da classe (2 indica que se o nome completo da classe for "a.b.c" por exemplo, deverá ser mostrado apenas "b.c")
  • m - é a mensagem (não pode faltar !)
  • n - é o separador de linhas do SO ("\n" ou "\r\n“)
109
POO-Java
110
Log4j - Resumo
  • Principais componentes:
    • Logger: permite realizar requisições de log.
    • Appender: corresponde ao destinatário de uma mensagem de log.
    • Layout: especifica o formato de uma mensagem de log
  • Propriedades de um objeto Logger
    • nome
    • nível
  • Hierarquia de loggers oferece um maior controle;
  • Diversas saídas: Console, Arquivo, Banco de Dados, XML, HTML, e-mail, ...
  • API de código aberto;
111
Log4j - Resumo
  • Elimina a necessidade de uso de “System.out” para depuração do código fonte;
  • Permite controlar de maneira flexível as saídas de log;
  • Configuração do log em tempo de execução sem alteração na codificação e sim em um arquivo de configuração;
  • Com o uso de logging, há a possibilidade de diminuição do desempenho da aplicação.
112
Exercício
  • log4j.rootLogger=DEBUG, htmlAppender
  • log4j.appender.htmlAppender=org.apache.log4j.ConsoleAppender
  • log4j.appender.htmlAppender.layout=org.apache.log4j.PattenLayout
  • log4j.appender.htmlAppender.layout. ConversionPattern=%-4r [%t] %-5p %c - %m%n
113
Parágrafo @since
  • Especifica a versão onde o identificador foi introduzido
  • Recebe o identificador da versão
  • Exemplo:


  • @since 1.0b