2016-02-24 26 views
7

ho provato i seguenti loggerJava quadro di registrazione che non richiede dichiarazione LOGGER su ogni classe

  • Java Registrazione API
  • Log4j
  • slf4j

Tutti di questi richiede una dichiarazione LOGGER a livello di classe, come quelli di seguito

private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName()); 
private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class); 
private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class); 

Questo mi sembra orribile, esiste un framework per logger in java che non richiede questa dichiarazione?

Quello che sto cercando, posso avere una dichiarazione globale come

private final static Logger Logger = Logger.getLogger(MyApp.class); 

Ma quando chiamo Logger.log (..) dalla classe XXX.class poi il logger dovrebbe fare uso del nome XXX.class.

+2

È completamente a te (in uno di questi framework) come si definiscono e si denominano i logger. Potresti averne uno per l'intera applicazione, o chiamare 'getLogger' su ogni chiamata. – Thilo

+0

Correlati: http://stackoverflow.com/questions/26600757/standard-way-to-implement-a-logger-across-classes-in-java?rq=1 http://stackoverflow.com/questions/27038694/ is-there-an-easy-way-to-create-a-logger-istanza-per-ogni-classe? rq = 1 – Thilo

+0

@Thilo avendo uno per l'intera applicazione farà tutti i registri con lo stesso nome. Che non sto cercando. Invece il framework deve mostrare il nome della classe del chiamante. – Edi

risposta

2

Il tuo problema è più che probabile che non con il quadro di registrazione, ma con il layout.

Esempio concreto

so35592962/App.java

package so35592962; 
import org.apache.logging.log4j.*; 
import so35592962.sub.OtherClass; 
public class App { 
    public static final Logger logger = LogManager.getLogger(); 
    public static void main(String[] args) { 
    logger.error("in App.main"); 
    OtherClass.act(); 
    } 
} 

so35592962/sub/OtherClass.java

package so35592962.sub; 
import static so35592962.App.logger; 

public class OtherClass { 
    public static void act() { 
    logger.error("OtherClass.act"); 
    } 
} 

Così si può vedere questo è del tutto ciò che si vuole: le classi che utilizzano un unico logger. Quindi, buon punto, Log4J2 può essere usato per quello.

Ora aggiungere il file magia log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="error"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

L'esecuzione di questo stamperà:

12:05:28.834 [main] ERROR so35592962.App - in App.main 
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act 

Guarda, ci sono nomi di classi diverse qui! Eppure ho usato Log4J2.

Che cosa è successo qui?

Nota il modello utilizzato nel tag PatternLayout:

%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n

Gli esempi standard e quello che di solito si vede su Internet tutti usano il modello %L. Questo modello mostra il nome del logger. Ma hai detto che non lo vuoi. Fortunatamente esistono altri modelli. %C mostrerà il nome della classe invece del nome del registratore. Questo è lo schema che viene usato qui.

Secondo the PatternLayout documentation, il modello %C esegue le seguenti operazioni:

uscite il nome completo della classe del chiamante che emette la richiesta di registrazione.

Nota importante, citato anche nella documentazione:

Generare il nome della classe del chiamante (informazioni sulla posizione) è un'operazione costosa e può influire sulle prestazioni. Usare con cautela.

+0

Ma se si dispone di un solo Logger, non è più possibile assegnare diversi livelli di registro (o diversi formattatori o appendici diversi) a diversi Logger. – Thilo

+0

Corretto, ma questo risponde alla domanda iniziale, credo. Un unico logger, utilizzando il nome della classe. –

+2

Inoltre, questa risposta non è un "sì, con tutti i mezzi, fai questo", ma una "tua richiesta può essere fatta, ecco come". Personalmente non lo approvo, ma se ti lavora per l'OP, sono felice di averlo aiutato! –

1

È possibile modificare entrambi in annotazioni di classe con Lombok.

Problemi correlati