Nunca consegui entender o Log4J. Por que toda vez que eu preciso logar alguma coisa eu tenho que ir lá em cima da minha classe e colocar:
private static Logger logger = Logger.getLogger(MyclassName.class);
Por que eu tenho que passar uma classe para o meu logger? O que isso significa? Vários logs por classe? Por que a coisa não pode ser simples?
Por que eu preciso de um arquivo de configuracão? Onde eu coloco esse arquivo? Por que quando eu mudo o nível nesse arquivo nada acontece? Será que ele está pegando outro arquivo? Ou minha configuracão está errada?
O que é APPENDER? Será que eu preciso saber o que é um appender para trabalhar com o Log4J? E layout? E root logger? Log da raiz?
O que é isso:
#define the console appender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
# now define the layout for the appender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# now map our console appender as a root logger, means all log messages will go to this appender
log4j.rootLogger = DEBUG, consoleAppender
Mas eu só quero logar. Será que preciso saber sobre appenders, layouts, root logger, para fazer um log?
Claro que serei voto vencido, mas eu sempre achei o Log4J um bom exemplo de como transformar algo simples em complicado.
Então deixo a pergunta aqui? O que vc gosta do Log4J? Vc acha ele simples de usar? O que poderia ser mais simples e menos complicado?
Há tempos tenho uma biblioteca de logging baseada em anos de observacoes. Estou lancando o projeto aqui: http://mentalog.soliveirajr.com
Abaixo um pequeno exemplo. Qual é a opinião do pessoal sobre as vantagens e desvantagens da abordagem abaixo sobre a abordagem do Log4J.
// MentaLog - Non-intrusive, fast, garbage-less, colored and straightforward logging
// To use MentaLog all you have to do is:
import static org.mentalog.Log.*; // and that's it
// Now you can start logging
Warn.log("This is a log message!", "user =", user.getUsername(), "age =", user.getAge());
// You will get the following log written to System.out
21:11:17.263-WARN This is a log message! user = saoj age = 15
// By default, MentaLog logs to the console, but you can easily change that with:
Log.setConsole(false); // or Log.setFile(true);
// or -DlogConsole=false
// or -DlogFile=true
// Now if you log again, your log goes to a file Warn.log
Warn.log("This is a log message!", "user =", user.getUsername(), "age =", user.getAge());
// You will get a file Warn.log with the following contents:
LOG OPENED - 19/09/2011 21:15:42.627
21:15:42.630 This is a log message! user = saoj age = 15
// When you think it is time to roll, simply call roll() and your log file will be rolled:
Warn.roll();
// Let's go back to console
Log.setConsole(true);
// And use some colors now:
Log.setColors(true);
Fatal.log("This is a log message!", "user =", user.getUsername(), "age =", user.getAge());
// if you terminal supports colors, you should see the message below in red:
21:15:42.630-FATAL This is a log message! user = saoj age = 15
// if you see some weird characters in the beginning of the message, that means you terminal does NOT support colors, so turn it off
Log.setColors(false);
// To change the log level, simply do:
Log.setLevel(Debug); // or -DlogLevel=Debug
// To change the color of a level, simply do:
Warn.setColor(32); // or -DwarnColor=32
// To change the log directory of your log files, simply do:
Log.setDir("/var/log/myLogs"); // or -DlogDir=/var/log/myLogs
// To enable/disable any individual level, *bypassing* the current log level, simply do:
Warn.enable(true); // no matter what the level is, it will be logged
Warn.enable(false); // not matter what the level is, it will NOT be logged
Warn.enable(null); // please follow the log level
// To create any logger so you can use for anything, simply do:
Logger myLogger = Log.createLogger("myDir" /* log dir */, "Audit" /* filename */, true /* isSynchronized */);
// and just log as before:
myLogger.log("This is a log message!", "user =", user.getUsername(), "age =", user.getAge());
// will print in the file myDir/Audit.log
21:15:42.630 This is a log message! user = saoj age = 15
// and roll
myLogger.roll();
// and close when you are done:
myLogger.close();
// and remember, your log levels are enumerations, so you can pass then around as arguments:
public void doSomethingWithMyLog(Log level); // only accepts a logger that is a level
public void doSomethingWithMyLog(Logger logger); // accepts any logger: a level one or one you created
// and you can do something like this:
for(Log level: Log.values()) {
level.log("Hi");
}
// or
Log level = Log.valueOf("Warn");