Neste post vou explicar como usar a API de Log para mostrar os logs de execução da aplicação e também como usar o componente TraceTarget, que é muito útil para poder recuperar as informações das chamadas para o servidor, facilitando a resolução de problemas.
No Flex temos duas opções para recuperar informações ou logs de execução de uma aplicação. Uma primeira maneira e a mais utilizada, é usar a função global trace(”) para mostrar informações no console do FlashBuilder. Essa abordagem sempre requer que a aplicação esteja sendo executada em modo de debug, o que exige a instalação de um FlashPlayer versão de debug. Lógico que para o ambiente de desenvolvimento isso não é um problema, já que a instalação do FlashBuilder já inclui a versão correta do FlashPlayer versão debug. Mais e quando a aplicação está em produção, ou seja, quando não contamos com a versão de debug do FlashPlayer? Ai que entra a segunda opção.Na segunda opção vamos usar a API de Logging do Flex, que vai nos permitir delegar para uma classe a função de logar informações, seja usando o trace(”), primeira abordagem, ou até mesmo customizando a forma de apresentação. Esta abordagem também nos permite controlar o que é exibido, utilizado categorias e nível de log.
A API de Logging do Flex é muito simples de ser usada. Toda vez que queremos usa-la, estaremos envolvendo duas partes:
Para ficar mais fácil de entender como usar a API, vamos imaginar que queremos logar quando a aplicação é pré-inicializado, inicializado e criado.Inicialmente iremos usar a função global trace(”) e depois usar as classes de Log.
[cc_actionscript]
Debugando a aplicação teremos no Console:
[cc_actionscript]
A Aplicação foi pré inicializada
A Aplicação foi inicializada
A Aplicação foi criada
[/cc_actionscript]
Agora vamos ver como ficaria se usarmos a API:
Vale lembrar que só é necessário declara-lo uma vez só na aplicação inteira. Ainda podemos customizar este target como por exemplo definir quais os levels que quero mostrar e se quero apresentar informações adicionais. Antes de mais nada, se debugarmos a aplicação teremos:
[cc_actionscript]
A Aplicação foi pré inicializada em: Sat Mar 5 2011
A Aplicação foi inicializada
A Aplicação foi criada
[/cc_actionscript]
Se prestarmos atenção no último exemplo, definimos que o level seria info, mais então porque o level warn foi logado? A API nos permite selecionar os níveis ALL –> DEBUG –> INFO –> WARN –> ERROR –> FATAL. Então se selecionarmos o nível INFO, tudo o que for INFO e menos abrangente será logado. Se selecionarmos o nível ERROR, somente logs com o nível ERROR e FATAL serão apresentados.
Para exemplificar a utilização das categorias, vamos criar um componente adicional:
[cc_actionscript]
[/cc_actionscript]
Vamos declarar o componente e debugar a aplicação.
[cc_actionscript]
[/cc_actionscript]
O resultado é:
[cc_actionscript]
3/5/2011 21:38:56.878 [INFO] br.com..LogginExample A Aplicação foi pré inicializada em: Sat Mar 5 2011
3/5/2011 21:38:56.909 [INFO] br.com..components.MyComponent MyComponent preinitialized
3/5/2011 21:38:56.909 [INFO] br.com..components.MyComponent MyComponent initialized
3/5/2011 21:38:56.910 [WARN] br.com..LogginExample A Aplicação foi inicializada
3/5/2011 21:38:57.057 [INFO] br.com..components.MyComponent MyComponent created
3/5/2011 21:38:57.057 [INFO] br.com..LogginExample A Aplicação foi criada
[/cc_actionscript]
Imagine que só queremos apresentar os logs com a categoria br.com..components.*
[cc_actionscript]
level=”{LogEventLevel.INFO}” filters=”[‘br.com..components.*’]”/>;
[/cc_actionscript]
O Resultado é:
[cc_actionscript]
3/5/2011 21:59:44.240 [INFO] br.com..components.MyComponent MyComponent preinitialized
3/5/2011 21:59:44.241 [INFO] br.com..components.MyComponent MyComponent initialized
3/5/2011 21:59:44.387 [INFO] br.com..components.MyComponent MyComponent created
[/cc_actionscript]
Poderia querer imprimir os logs com a categoria br.com..components.MyComponent e br.com..LogginExample:
[cc_actionscript]
level=”{LogEventLevel.INFO}” filters=”[‘br.com..components.MyComponent’, ‘br.com..LogginExample’]”/>;
[/cc_actionscript]
O Resultado é:
[cc_actionscript]
3/5/2011 22:02:40.929 [INFO] br.com..LogginExample A Aplicação foi pré inicializada em: Sat Mar 5 2011
3/5/2011 22:02:40.960 [INFO] br.com..components.MyComponent MyComponent preinitialized
3/5/2011 22:02:40.960 [INFO] br.com..components.MyComponent MyComponent initialized
3/5/2011 22:02:40.961 [WARN] br.com..LogginExample A Aplicação foi inicializada
3/5/2011 22:02:41.105 [INFO] br.com..components.MyComponent MyComponent created
3/5/2011 22:02:41.106 [INFO] br.com..LogginExample A Aplicação foi criada
[/cc_actionscript]
Moral da história, para poder filtrar os logs pela categoria, usamos a propriedade filter, que recebe uma lista de strings com as categorias permitidas. A API também permite a utilização do curinga *, e por padrão o filtro é igual a *, ou seja, imprime tudo.
A última coisa que gostaria de mostrar é como usuar o TraceTarget para logar informações sobre as chamadas remotas. Irei utilizar como exemplo um HttpService consumindo o rss do Globo Esporte.
[cc_actionscript]
[/cc_actionscript]
No console podemos ver a chamada feita e o resultado da chamada.
[cc_actionscript]
‘136ECED5-AD86-47EB-E77F-88EE4AA0EA34’ producer set destination to ‘DefaultHTTP’.
‘direct_http_channel’ channel endpoint set to http:
‘136ECED5-AD86-47EB-E77F-88EE4AA0EA34’ producer sending message ‘E52C0A6D-882A-37F9-F4C9-88EE4B7DF0FC’
‘direct_http_channel’ channel sending message:
(mx.messaging.messages::HTTPRequestMessage)#0
body = (Object)#1
clientId = (null)
contentType = “application/x-www-form-urlencoded”
destination = “DefaultHTTP”
headers = (Object)#2
httpHeaders = (Object)#3
messageId = “E52C0A6D-882A-37F9-F4C9-88EE4B7DF0FC”
method = “GET”
recordHeaders = false
timestamp = 0
timeToLive = 0
url = “http://globoesporte.globo.com/dynamo/rss2.xml”
‘136ECED5-AD86-47EB-E77F-88EE4AA0EA34’ producer connected.
‘136ECED5-AD86-47EB-E77F-88EE4AA0EA34’ producer acknowledge of ‘E52C0A6D-882A-37F9-F4C9-88EE4B7DF0FC’.
Decoding HTTPService response
Processing HTTPService response message:
(mx.messaging.messages::AcknowledgeMessage)#0
body = “
clientId = “DirectHTTPChannel0”
correlationId = “E52C0A6D-882A-37F9-F4C9-88EE4B7DF0FC”
destination = “”
headers = (Object)#1
DSStatusCode = 200
messageId = “FDA3E270-BAD8-82AD-2770-88EE5BE5C3E8”
timestamp = 0
timeToLive = 0
[/cc_actionscript]
E isso é tudo o que você precisa para começar a utilizar a API, nos próximos posts irei ensinar como customizar a saída do log.