2012-06-05 7 views
13

Wie verwaltet Log4j mehrere log4j.properties in seinem Klassenpfad? Welche Datei log4j.properties hat Vorrang? Lassen Sie mich das genaue Szenario beschreiben.Mehrere Log4j.properties-Dateien im Klassenpfad

Ich habe mehrere Maven-Module von verschiedenen Teams entwickelt und jedes von ihnen hat seine eigene log4j.properties-Datei. Für alle diese log4j.properties-Datei ist RootLogger zusammen mit ConsoleAppender und FileAppenders konfiguriert.

Nun, wenn Log4j welche log4j.properties Datei lädt wird es verwendet, um die RootLogger Einstellungen zu konfigurieren? Wie erstellt Log4j die Logger-Hierarchie? Wie wirkt sich die log4j.properties-Datei in anderen 3rd-Party-Jars auf den Protokollierungsprozess aus?

Antwort

9

Die erste Datei im Klassenpfad wird geladen. Wenn also A.jar und B.jar beide eine Datei enthalten und A.jar im Klassenpfad vor B.jar steht, wird die Datei von A.jar geladen. So funktioniert der Klassenlader.

+0

Ich habe eine spezifische Anforderung Wenn ich laden möchten sowohl die Properties-Datei, wie kann ich es achive? Ich meine log4j.properties Dateien von a.jar und b.jar sollten geladen werden ... Gibt es eine Möglichkeit ?? – Gourabp

+0

Warum sollten Sie beide laden? Das Ziel der Externalisierung der Konfiguration in eine Datei besteht darin, die Protokollierung so zu konfigurieren, wie Sie es möchten. Daher sollten die JAR-Dateien nicht einmal mit einer gebündelten log4j.xml-Datei geliefert werden.Stattdessen sollten sie dokumentieren, welche Logger sie verwenden (per Konvention ist der Loggername der Klassenname), und dann erstellt der Application Assembler unter Verwendung beider JAR-Dateien eine eigene Konfigurationsdatei, die die Konfiguration für alle in der Bibliothek verwendeten Bibliotheken enthält Anwendung. –

+0

Ich möchte beide laden, weil ich eine Client-API schreibe, wo ich die Client-API-Protokolle in eine separate Datei protokollieren möchte. Die App kann ihre eigene log4j-Konfiguration haben, aber ich möchte nicht, dass die Client-Seite etwas ändert. Ich gebe ihnen einfach das Api-Glas, in dem der API-spezifische Appender und Logger definiert wird. Beachten Sie auch, dass ich es nicht programmatisch erreichen möchte, sondern durch Konfiguration. – Gourabp

2

log4j ver 1.x:

Wie andere gesagt haben, sieht log4j für die erste Konfigurationsdatei im Classpath. Siehe: http://logging.apache.org/log4j/1.2/manual.html

Aber wenn beide ‚log4j.xml‘ und ‚log4j.properties‘ Dateien im Classpath, so scheint es aus Experimenten, dass log4j Vorrang zu ‚log4j.xml‘ über ‚log4j.properties‘ gibt.

. Erstens scheint log4j im Klassenpfad nach der ersten 'log4j.xml' Datei zu suchen. Wenn es keine gibt, dann scheint log4j dann im Klassenpfad nach der ersten 'log4j.properties'-Datei zu suchen.

Das Kopieren und Einfügen von dem folgenden Code kann helfen, zu bestimmen, welche Konfigurationsdatei verwendet wird:

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:

Die Die Suchreihenfolge für die Standardkonfigurationsdatei ist hier dokumentiert: http://logging.apache.org/log4j/2.x/manual/configuration.html

, d. H. Für log4j Version 2.x, wenn keine Konfigurationsdatei mit höherer Priorität gefunden wird (z. log4j2-test. [Eigenschaften | Yaml | json | xml]) dann wird die Datei log4j2.properties verwendet, wenn sie im Klassenpfad gefunden wird. Beachten Sie, dass log4j2.xml die niedrigste Priorität hat und nur verwendet wird, wenn die Konfigurationsdateien log4j2 'properties', 'yaml' oder 'json' nicht gefunden werden.

Hinweis: Um das Debugging von log4j-Konfigurationsproblemen zu erleichtern, legen Sie die Eigenschaft 'log4j.debug' fest, z. mit:

java -Dlog4j.debug ... 

Siehe auch:How to initialize log4j properly?

+0

sieht aus wie es umgekehrt ist? refer [link] (https://logging.apache.org/log4j/2.x/manual/configuration.html) –

+0

Antwort bearbeitet, um log4j ver 2.x widerzuspiegeln, Link zur Dokumentation hinzuzufügen (Danke @chandra_cst) und zusätzliches Debugging Hinweis. –

Verwandte Themen