Como fazer logging da maneira mais correta/menos penosa

8 respostas
P

Alguém aí tem uma idéia de como fazer logging de forma a ter esta funcionalidade habilitada somente quando estivesse rodando a aplicação no WTK ?

Atualmente no meu código eu tenho uma classe Debug e chamadas ao método write estão espalhadas pelo código.
Acontece que sou penalizado pelas criações desnecessárias de objetos String quando rodando no celular.

Eu queria tirar este fardo, habilitando o logging somente quando estivesse no WTK. Ouvi dizer que o AspectJ, altera o bytecode da aplicação para fazer coisas que normalmente seriam muito trabalhosas.
Eu poderia me beneficiar disto ?
Existe uma solução mais elegante do que fazer algo como:

if (Debug.isWTK()) {
   Debug.write("Valor de x é "+x);
}

Outra dúvida que tenho é se o AspectJ poderia ser usado em projetos J2ME com algum benefício. Encontrei um link interessante no Google para um cara, mas o PDF em questão está no site protegido por login/senha. :frowning:

obrigado.

8 Respostas

louds

Usar AspectJ pode ser uma boa opção, assim seu código fica mais otimizado quando for rodar em um celular.
Outra opção mais simples é usar o CPP (C Pre-Processor) ou qualquer outro (m4, sed, etc).

PS: Não me atirem pedras pela segunda sugestão.

P

Olá louds,

O que eu tava inicialmente pretendendo era justamente usar o AspectJ para modificar o bytecode da aplicação, extirpando estas chamadas ao método write da minha classe Debug. Nunca usei AspectJ ou qualquer coisa relacionada a AOP, mas tava começando a ler sobre isto e foi uma idéia que me passou pela cabeça.

Hoje fiz algumas pesquisas no assunto e tem gente sim, mexendo com AspectJ para modificar o bytecode de aplicações J2ME, logo, me parece razoável esta minha idéia !

O que eu ganho com isto ? Vejo 2 principais ganhos:

  • Tamanho da midlet
    Menos strings contendo código para debug, é igual a aplicação menor.

  • Performance
    Chamadas sem sentido (Debug.write) sendo feitas no celular, de nada vão ser úteis para mim, pois eu só quero que o código esteja habilitado, quando eu estiver usando o Eclipse, por exemplo.
    Só vou estar criando um monte de objetos String e destruindo…aja GC para isto…

Eu não conheço esses items que você citou: m4, sed.
Poderia dar uma breve dica sobre eles ?

Quando ao pré-processador do C++ nem sei como poderia me ajudar, mas enfim, valeu pela dica. Vou ver o que descubro.

grato.

louds

Com o CPP voce pode fazer assim:

public void fazX() {
#if defined(_DEBUG)
     Debug.log("fazendoX!");
#end
      fazendo X;
}

Então quando vc for compilar teus fontes, vc primeiro passa o cpp neles dizendo se _DEBUG está ou não definido.

Usando sed/m4 é parecido, mas não tão simples.

P

O pré-processador do C++ vai reconhecer arquivos fonte java e não vai apresentar erros ? Como ?
Achava que era especifico para a linguagem C/C++…

É uma pena que o Java não tenha este recurso de compilação condicional.

Vou estudar mais o AspectJ e ver se consigo extrair os bytecodes de forma fácil. Senão, vou tentar pela mais difícel, afinal, não vejo outra solução em se tratando de J2ME, onde quanto menos código improdutivo. melhor…

valeu !

louds

“boone”:
O pré-processador do C++ vai reconhecer arquivos fonte java e não vai apresentar erros ? Como ?
Achava que era especifico para a linguagem C/C++…

O CPP (pre-processador do C) apenas se preocupa com a linguagem de macros dele, vc pode usar oque quiser por traz. (pelo menos com o do gcc é assim).

smota

Existem alguns pré-processadores focados em código Java.

De qualquer modo é tudo com a mesma idéia, subsituição texto das macros. Entonces se quiser usar o CPP mesmo não há nenhum problema (na verdade o problema de não ter suporte nativo é que o codigo usando diretivas de um preprocessador tornam o código inválido, entonces tem que ser uma diretiva que use comentários da linguagem)

O Google pode ajudar mas veja:
gjpp - gnu java pre processor
Java Plus Pre Processor

P

Era o que eu precisava…ao invés de usar um canhão (AspectJ), posso usar um estilingue (gjpp) que vai dar o mesmo resultado.
Vou alterar meu build.xml para acrescentar esta task e quando for gerar a midlet, o código será limpo destas linhas…

valeu mesmo pela dica…eu desconhecia que existia pré-processadores para java…

P

Acabei de descobrir que meu amiguinho Antenna, já tem uma tarefa para pré-processamento (WtkPreprocess), ou seja, praticamente não vou ter trabalho nenhum, já que já faço uso dele à algum tempo.
Nunca reparei nesta tarefa, mas pelo que vi, tem tudo o que eu necessito:
#define, #if, #endif

Posso espalhar código de debug a vontade agora sem me preocupar no impacto que irá causar no tamanho da midlet e nem em degradação de performance…

Criado 13 de abril de 2004
Ultima resposta 14 de abr. de 2004
Respostas 8
Participantes 3