Interessante essa API, muitos projetos que eu vejo/trabalho utilizam algo parecido para encapsular a logica do logging, algumas dúvidas:
Essa lib permite a definiçao de appenders como o log4j?
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 );
}
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?
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).
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.
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
Eu sei que o projeto não é seu! 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
Se eu tivesse tempo agora, eu ia baixar, entender e escrever um artigo sobre estes 2 projetos, mas infelizmente estou numa correria…