C'è un modo per specificare Log4J 2.x log4j2.xml
posizione del file manualmente (come DOMConfigurator
in Log4J 1.x), senza scherzare con classpath e le proprietà di sistema?Come specificare la posizione di configurazione di Log4J 2.x?
risposta
È possibile utilizzare il metodo statico #initialize(String contextName, ClassLoader loader, String configLocation)
(vedere la fonte here) in org.apache.logging.log4j.core.config.Configurator
. (È possibile passare null per il caricatore di classe.)
essere consapevoli del fatto che questa classe non fa parte delle API pubblica in modo il codice può rompere con qualsiasi versione minore.
Per completezza, è anche possibile specificare la posizione del file di configurazione di sistema con questa proprietà:
-Dlog4j.configurationFile=path/to/log4j2.xml
Utilizzando la LoggerContext permette di setConfigLocation.
File f = new File(this.logConfigFile);
URI fc = f.toURI();
System.out.println("Loading logging config file: " + fc);
Logger l = (Logger) LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
l.getContext().setConfigLocation(fc);
o in alternativa
LoggerContext.getContext().setConfigLocation(java.net.URI);
è possibile inizializzare come qui di seguito così
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4j file Path));
XmlConfiguration xmlConfig = new XmlConfiguration(source);
Logger logger = (Logger) LogManager.getLogger();
logger.getContext().start(xmlConfig);
In ogni classe è possibile ottenere un'istanza logger, come di seguito
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private final Logger logger = LogManager.getLogger(ABC.class);
[org.apache.logging.log4j.Logger] (https://logging.apache.org/log4j/2.0/log4j-api/apidocs/org/apache/logging/log4j/Logger.html) non ha getContext() metodo. – Boris
In Windows, essere consapevoli che è necessario utilizzare un URI con la log4j.configurationFile
proprietà
-Dlog4j.configurationFile=file://C:\path\to\log4j2.xml
Credo che la proprietà di sistema accetti un normale percorso file (relativo o assoluto) e un URI. –
Questo non è un modo semplice, perché Configurator (e altri) possono essere estesi (http://logging.apache.org/log4j/ 2.0/manual/extending.html) – mcoolive
Dove chiamo '' 'Configurator.initialize()' '' nel mio progetto? Lo sto chiedendo perché lo sto facendo in un blocco statico e Log4j sta registrando che non ha trovato il file prima dell'esecuzione del mio codice. –