1
|
- Professor
- Ismael H F Santos – ismael@tecgraf.puc-rio.br
|
2
|
- 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
|
|
4
|
- 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
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
17
|
|
18
|
|
19
|
|
20
|
|
21
|
|
22
|
|
23
|
|
24
|
|
25
|
|
26
|
|
27
|
|
28
|
|
29
|
|
30
|
|
31
|
|
32
|
|
33
|
|
34
|
|
35
|
|
36
|
|
37
|
|
38
|
|
39
|
|
40
|
|
41
|
|
42
|
|
43
|
|
44
|
|
45
|
|
46
|
|
47
|
|
48
|
|
49
|
|
50
|
|
51
|
|
52
|
|
53
|
|
54
|
|
55
|
- 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
|
- 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 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:
|
58
|
- 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
|
|
60
|
- 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
|
- 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
|
|
63
|
|
64
|
|
65
|
|
66
|
|
67
|
- 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
|
- 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
|
- 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
|
- 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
|
|
72
|
- 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
|
- 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é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
|
- 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
|
|
77
|
|
78
|
- 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
|
- 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
|
- 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
|
- O método addAppender da classe Logger adiciona um objeto Appender a um
certo logger.
- Há diversas classes que implementam a interface Appender...
|
82
|
- 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
|
- 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
|
- 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
|
|
86
|
|
87
|
- 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
|
- 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
|
|
90
|
|
91
|
|
92
|
- 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
|
- 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
|
- 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
|
- 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
|
|
97
|
|
98
|
- AsyncAppender
- ConsoleAppender
- DailyRollingFileAppender
- JMSAppender
- NTEventLogAppender
|
99
|
- Handlers
- StreamHandler
- ConsoleHandler
- FileHandler
- SocketHandler
- MemoryHandler
- Formaters
- SimpleFormatter
- XMLFormatter
|
100
|
- 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
|
- 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
|
|
103
|
- 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
|
- Considere o seguinte arquivo de propriedades:
|
105
|
- Considere que o arquivo de propriedades anterior foi passado como
argumento para o programa a seguir:
|
106
|
- 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
|
- 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
|
- 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
|
|
110
|
- 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
- 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
|
- 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
|
- 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
|
- Especifica a versão onde o identificador foi introduzido
- Recebe o identificador da versão
- Exemplo:
- @since 1.0b
|