log5j - despretensioso porém útil

Pessoal,

Vejam esta nova biblioteca, lançada recentemente, que nada mais é do que um “façade” em cima da classe Logger do Log4j:
http://blog.felipecoury.com/jep/2008/02/log5j.html

Achei bastante interessante, apesar de toda sua simplicidade.

Abraços!

Poxa, abri a notícia com um nariz torcido, mas gostei.

Fala Felipe,

Interessante essa API, muitos projetos que eu vejo/trabalho utilizam algo parecido para encapsular a logica do logging, algumas dúvidas:

  1. Essa lib permite a definiçao de appenders como o log4j?
  2. Como voce mostrou em seu blog, essa API acaba com a recuperacao do logger a partir do getLogger(MinhaClasse.class), apesar disso o output do log é formatado como no estilo antigo: “[MinhaClasse] …”?

Como eu tentei explicar, essa lib é somente um “façade” mesmo para o Log4J. Ela tem todas as funcionalidades normais do Log4J com estas duas novidades. O resto é todo igual…

Sim, ele pega esta informação do stack trace. Segue um trecho do código-fonte:

    /**
     * Obtain a new logger to use with the Log5j system.
     */
    public static Logger getLogger() {
        String name = new Exception().getStackTrace()[1].getClassName();
        return getLoggerImpl( name );
    }

Parece ser bem produtivo.
Mas tem apenas essa duas funcionalidades ?

Eu tenho um template no Eclipse que constrói pra mim toda a linha

private final Logger log = Logger.getLogger(NomeDaClasse.class);

portanto, eu não vejo ganho no construtor.

A outra funcionalidade é interessante. Tão interessante, que eu criei algo pra obter isso pra mim. A diferença é que eu uso a sintaxe do MessageFormat.

public class FormattedMessage {

    private final String message;
    private final Object[] args;
    
    public FormattedMessage(String message, Object... args) {
        this.message = message;
        this.args = args;
    }
    
    public String toString() {
        return MessageFormat.format(message, args);
    }

}

Não sei se, em termos de desempenho, MessageFormat é melhor ou pior do que o mecanismo do log5j.
Mas esta classe que eu criei garante que a substituição de valores só irá ocorrer caso o método toString() seja chamado pelo Log4J, o que só irá ocorrer se a mensagem for realmente logada. Ou seja, não é necessário usar o “if (isDebugEnabled())”.

No caso do Log5J, existe esse cuidado, ou o “if (isDebugEnabled())” continua tendo que ser usado?

E o novo contrutor será inutil se eu fizer isso:


public class LoggerFactory{
public static Logger getLogger(){
return Logger.getLogger();
}
}

public class Teste{
public static void main(String...args){
Logger thisLogger = LoggerFactory.getLogger();
//Esse é um logger para LoggerFactory.class e não Teste.class
}
}

Sei que em pratica acho que ninguem faria isso, mas pode ocorrer.

Não sei se já viram o Simple Log Facade 4 Java (http://www.slf4j.org/) e a sua implementação, o LogBack (http://logback.qos.ch/). Tenho utilizado em alguns projetos e achei bem mais fácil de configurar e usar (editado: comparado com o Log4J).

dango,

Não conhecia nenhum dos dois, mas parece extremamente interessante.

Apenas como crítica - ao projeto e não a você -, senti falta de um exemplo de como usar a API logo de cara, mesmo algo simples. Isso me deixa frustrado quando entro em uma página para conhecer o projeto. Acho legal ter algo logo de cara, como um Getting Started, para ver o potencial da biblioteca.

Talvez fosse interessante se alguém pudesse escrever um artigo, apresentando as bibliotecas de uma forma mais “mastigada”. Se eu tiver tempo - coisa que não tenho tido com freqüência - tentarei baixar as libs e escrever um artigo sobre elas.

Abraços e obrigado pela dica!

Mas vc está falando de qual API? Do SLF4J? Se for, o projeto não é meu! É do Ceki Gülcü (acho que é o mesmo desenvolvedor do Log4J, mas não tenho certeza) e é repleto de documentação! Ou eu não entendi :slight_smile:

dango,

Eu sei que o projeto não é seu! :slight_smile: Porisso que falei que a crítica era ao projeto, e não a você.

E foi mais um comentário do que uma reclamação. Eu vi, o projeto tem uma vasta documentação. Porém, para pessoas sem tempo de ler a documentação mais a fundo, fica complicado passar páginas e páginas de documentação para entender o poder da biblioteca, entendeu?

O que eu acho legal em projetos como esse, é quando na primeira página já tem um exemplo de código usando as funcionalidades, de forma que a gente bata o olho e fale: “Pô, isso eu podia usar no meu projeto”. Entende? Coisa de cara chato mesmo, como eu :smiley:

Se eu tivesse tempo agora, eu ia baixar, entender e escrever um artigo sobre estes 2 projetos, mas infelizmente estou numa correria…

Abração e obrigado pela dica!