Utilizzo del logback e liste di stampa
Domanda
Sto iniziando a usare il logback e voglio sapere se ci sono modi migliori per fare qualcosa. Ho questo codice:
public class ClassA {
private List<String> l;
private Logger logger;
public ClassA(){
this.logger = LoggerFactory.getLogger(this.getClass().getName());
}
....
public List<String> method() {
this.logger.debug("method()");
List<String> names;
try {
names = otherClass.getNames();
} catch (Exception e) {
String msg = "Error getting names";
this.logger.error(msg);
throw new ClassAexception(msg, e);
}
this.logger.debug("names: {}", xxxxx);
return names;
}
Finora ho qualche dubbio:
- Ogni classe avrà un
this.logger = LoggerFactory.getLogger(this.getClass().getName());
per creare un logger. - Ogni metodo avrà un
this.logger.debug("method()");
per sapere quando viene chiamato un metodo.
Non sembra buono. C'è un modo per risolverlo?
Inoltre voglio stampare un elenco nel .log in questa riga: this.logger.debug("names: {}", xxxxx);
il xxxxx dovrebbe essere sostituito con qualcosa per stampare l'elenco. Una classe anonima?
Grazie per aver letto!
Soluzione
Uso di AspectJ e log4j puoi usarlo. Compilare il codice con il compilatore ajc anziché javac e quindi eseguirlo normalmente con eseguibile java.
Devi avere aspectjrt.jar e log4j.jar sul percorso di classe.
import org.aspectj.lang.*;
import org.apache.log4j.*;
public aspect TraceMethodCalls {
Logger logger = Logger.getLogger("trace");
TraceMethodCalls() {
logger.setLevel(Level.ALL);
}
pointcut traceMethods()
//give me all method calls of every class with every visibility
: (execution(* *.*(..))
//give me also constructor calls
|| execution(*.new(..)))
//stop recursion don't get method calls in this aspect class itself
&& !within(TraceMethodCalls);
//advice before: do something before method is really executed
before() : traceMethods() {
if (logger.isEnabledFor(Level.INFO)) {
//get info about captured method and log it
Signature sig = thisJoinPointStaticPart.getSignature();
logger.log(Level.INFO,
"Entering ["
+ sig.getDeclaringType().getName() + "."
+ sig.getName() + "]");
}
}
}
Consulta la documentazione di AspectJ su come modificare le chiamate TraceMethodCalls.
// e.g. just caputre public method calls
// change this
: (execution(* *.*(..))
// to this
: (execution(public * *.*(..))
Riguardo a
Inoltre voglio stampare un elenco in .log in questa riga:
this.logger.debug("names: {}", xxxxx);
È supportato da slf4j / logback per impostazione predefinita. Basta
logger.debug("names: {}", names);
ad esempio
List<String> list = new ArrayList<String>();
list.add("Test1"); list.add("Test2"); list.add("Test3");
logger.debug("names: {}", list);
//produces
//xx::xx.xxx [main] DEBUG [classname] - names: [Test1, Test2, Test3]
O vuoi qualcosa di specificamente diverso?