2012-11-30 11 views
5

Sto scrivendo un'applicazione Web in Java e utilizzando SLF4J per la registrazione.SLF4J, Per evitare di scrivere LoggerFactory.getLogger (MyClassName.class) ogni volta

sto diventando stanco di scrivere la riga sotto per ogni classe che utilizza la registrazione:

private static final Logger logger = LoggerFactory.getLogger(ThisClassName.class); 

Per evitare codici ridondanti, sto pensando qualcosa di simile

interface Loggable { 
    Logger logger(); 
} 

e ogni classe può solo implementare questa interfaccia quindi un po 'di magia come AOP inserisce la parte LoggerFactory.

Qualcuno ha implementato questo o sa come raggiungerlo?

Grazie!

risposta

12

Stai usando eclissi? Se è così, perché non utilizzare un modello di codice con parole chiave come "logger" e il seguente modello per esso:

${:import(org.slf4j.LoggerFactory, org.slf4j.Logger)} 
private final static Logger LOGGER = LoggerFactory.getLogger(${enclosing_type}.class); 

In questo modo si sarebbe solo tipo "logger", ha colpito spostamento + spazio e hai fatto.

+0

Esattamente, semplice e fa il lavoro. Impiegare AOP solo per una questione così banale è una pazza idea IMHO (specialmente se il tuo progetto non è ancora configurato per AOP) –

0

La registrazione utilizzando AOP è ben dimostrata in Here. Sembra che non ci sia modo di inserire il logger in modo dinamico all'interno di un metodo per registrare i dettagli dell'esecuzione del metodo. I casi di test unitario possono occuparsene. La registrazione del metodo di chiamata può essere gestita da AOP

1

Si sta utilizzando CDI? in tal caso, creare un metodo produttore e quindi @Inserire il programma di registrazione su qualsiasi classe abilitata per CDI.

@Produces Logger createLogger(InjectionPoint injectionPoint) { 
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
} 

Vedi http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1662