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.
È 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
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
@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