2012-06-05 21 views
13

In che modo Log4j gestisce più log4j.properties nel suo classpath? Quale file log4j.properties ha la precedenza? Lasciami descrivere l'esatto scenario.Più file Log4j.properties nel classpath

Ho diversi moduli Maven sviluppati da diversi team e ognuno di essi ha il proprio file log4j.properties. Tutti questi file log4j.properties hanno RootLogger configurato insieme a ConsoleAppender e FileAppenders.

Ora, quando Log4j carica quale file log4j.properties verrà utilizzato per configurare le impostazioni di RootLogger? Inoltre, in che modo Log4j creerà la gerarchia di Logger? In che modo il file log4j.properties in altri jar di terze parti influisce sul processo di registrazione?

risposta

9

Il primo file nel classpath verrà caricato. Quindi, se A.jar e B.jar contengono entrambi un file, e A.jar viene prima di B.jar nel classpath, il file di A.jar verrà caricato. Ecco come funziona il caricatore di classi.

+0

Ho un requisito specifico Se voglio caricare sia il file delle proprietà come posso achive esso? Voglio dire che i file log4j.properties da entrambi a.jar e b.jar devono essere caricati ... Esiste un modo ?? – Gourabp

+0

Perché dovresti caricarli entrambi? L'obiettivo di esternalizzare la configurazione in un file è poter configurare la registrazione nel modo desiderato. Quindi i file jar non dovrebbero nemmeno avere un file log4j.xml in bundle.Invece, dovrebbero documentare quali logger usano (per convenzione, il nome del logger è il nome della classe), e quindi l'assemblatore di applicazioni, usando entrambi i file jar, creerebbe il proprio file di configurazione, contenente la configurazione per tutte le librerie usate nel applicazione. –

+0

Voglio caricarli entrambi perché sto scrivendo un'API client in cui voglio registrare i log specifici dell'API del client in un file separato. l'app può avere la propria configurazione di log4j ma non voglio che il client modifichi qualcosa. Darò loro solo il barattolo API in cui verranno definiti l'appender e il logger specifici per apice. Nota anche che non voglio raggiungerlo programmaticamente. Voglio farlo per configurazione. – Gourabp

2

log4j ver 1.x:

Come altri hanno detto, log4j cerca il primo file di configurazione nel classpath. Vedere: http://logging.apache.org/log4j/1.2/manual.html

Ma quando ci sono sia 'log4j.xml' e file 'log4j.properties' nel classpath, sembra dalla sperimentazione che log4j dà la precedenza a 'log4j.xml' over 'log4j.properties'.

Ad esempio, log4j sembra cercare nel classpath il primo file 'log4j.xml'. Se non ce n'è, quindi log4j sembra cercare nel classpath il primo file 'log4j.properties'.

Copiare e incollare dal codice di seguito possono aiutare a determinare quali file di configurazione viene utilizzato:

import org.apache.log4j.Logger; 

public class TestLog4j 
{ 

    static 
    { 
    System.out.println("Classpath: [" + System.getProperty("java.class.path") + "]"); 
    System.out.println("Found logging configuration files:"); 
    System.out.println(" log4j.xml: " + Logger.getRootLogger().getClass().getResource("/log4j.xml")); 
    System.out.println(" log4j.properties: " + Logger.getRootLogger().getClass().getResource("/log4j.properties")); 
    } 

    public static void main(String[] args) 
    { 
    System.out.println("main():"); 
    } 
} 

Edit:

log4j ver 2.x:

Il l'ordine di ricerca per il file di configurazione predefinito è documentato qui: http://logging.apache.org/log4j/2.x/manual/configuration.html

, ad esempio per la versione 2.x di log4j, se non viene trovato alcun file di configurazione di precedenza più elevato (ad es. log4j2-test. [proprietà | yaml | json | xml]) quindi viene utilizzato il file log4j2.properties se trovato nel classpath. Si noti che log4j2.xml ha la precedenza più bassa e verrà utilizzato solo se i file di configurazione 'properties', 'yaml' o 'json' di log4j2 non sono stati trovati.

Nota: Per facilitare il debug dei problemi di configurazione di log4j, impostare la proprietà 'log4j.debug', ad es. con:

java -Dlog4j.debug ... 

Vedi anche:How to initialize log4j properly?

+0

sembra che sia il contrario? refer [link] (https://logging.apache.org/log4j/2.x/manual/configuration.html) –

+0

Risposta modificata per riflettere log4j ver 2.x, aggiungendo il link alla documentazione (grazie a @chandra_cst) e ulteriori debug suggerimento. –

Problemi correlati