2017-10-17 1 views
0

Ich habe mehrere Klassen in einem Paket und mehrere Pakete in meinem Projekt. Für jene Dateien, die innerhalb der übergeordneten Klasse geerbt werden, istWie oft müssen Sie die Konfigurationsdatei für log4j2 einrichten?

{ // File location for log4j2.xml 
    System.setProperty("log4j.configurationFile", 
     "file:\\\\" + System.getProperty("user.dir") + "\\Properties\\log4j2.xml"); 
} 

Und doch, ich sehe So ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.

, natürlich, einmal ist nicht genug.

Also, was ist die allgemeine Regel, dass ich die Systemeigenschaft von log4j.configurationFile einstellen muss?

  • Einmal pro Paket?
  • Einmal pro Klasse?
  • Jede Eltern/Basisklasse, unabhängig vom Paket?
  • Oder etwas anderes?

Was ist Best Practice für mehrere Klassen und Pakete?

Antwort

3

Log4j 2 konfiguriert sich bei der Initialisierung, d. H. Wenn eine Logger-Instanz zuerst in einer Instanz einer JVM erstellt wird, ungefähr ... die erste Klasse in Ihrer Anwendung, die eine Logger-Instanz deklariert, veranlasst Log4j 2, sich zu initialisieren. Also, die Antwort auf diese Frage ...

Wie oft müssen Sie die Konfigurationsdatei für log4j2 einstellen?

... ist einmal.

Das in Ihrem OP gemeldete Problem: No log4j2 configuration file found. Using default configuration wird dadurch verursacht, dass Log4j die Konfigurationsdatei nicht finden konnte, auf die Sie es verweisen wollten. Dieses Problem ist nicht verursacht durch nicht 'die Konfigurationsdatei' oft genug einstellen.

Nach the docs Log4j wird für seine Konfigurationsquelle wie folgt aussehen:

  1. Log4j die „log4j.configurationFile“ Systemeigenschaft prüfen und, falls eingestellt, wird versuchen, die Konfiguration zu laden, die mit ConfigurationFactory, die der Dateierweiterung entspricht.
  2. Wenn keine Systemeigenschaft festgelegt ist, suchen die Eigenschaften ConfigurationFactory im Klassenpfad nach log4j2-test.properties.
  3. Wenn keine solche Datei gefunden wird, sucht YAML ConfigurationFactory im Klassenpfad nach log4j2-test.yaml oder log4j2-test.yml.
  4. Wenn keine solche Datei gefunden wird, sucht JSON ConfigurationFactory im Klassenpfad nach log4j2-test.json oder log4j2-test.jsn.
  5. Wenn keine solche Datei gefunden wird, sucht XML ConfigurationFactory im Klassenpfad nach log4j2-test.xml.
  6. Wenn eine Testdatei nicht gefunden werden kann, suchen die Eigenschaften ConfigurationFactory nach log4j2.properties im Klassenpfad.
  7. Wenn eine Eigenschaftendatei nicht gefunden werden kann, sucht YAML ConfigurationFactory nach log4j2.yaml oder log4j2.yml im Klassenpfad .
  8. Wenn eine YAML-Datei nicht gefunden werden kann, sucht JSON ConfigurationFactory im Klassenpfad nach log4j2.json oder log4j2.jsn.
  9. Wenn eine JSON-Datei nicht gefunden werden kann, versucht XML ConfigurationFactory, log4j2.xml im Klassenpfad zu suchen.
  10. Wenn keine Konfigurationsdatei gefunden werden konnte, wird die DefaultConfiguration verwendet. Dies führt dazu, dass die Logging-Ausgabe zur Konsole geleitet wird.

Wenn Ihr Versuch log4j.configurationFile erfolgreich gesetzt wurde dann Option 1 in Eingriff gebracht werden würde, aber dieser Versuch nicht erfolgreich ist, wissen wir dies, weil die Fehlermeldung Sie uns zitieren sagt, dass Log4j durch 10 auf Option fällt.

Ich würde vorschlagen, Ihre Anwendung mit -Dlog4j.configurationFile =/Pfad/zu/log4j2.xml oder sicherzustellen, dass die log4j2.xml auf Klassenpfad der Anwendung ist. Die Idee, Ihren Code mit System.setProperty(...) Calls verunreinigt zu fühlen, fühlt sich an wie ein Anti-Pattern und ist wahrscheinlich ziemlich spröde, da jeder statische Logger, der vor dem Aufruf System.setProperty(...) instanziiert wird in Log4j Initialisierung führt, bevor es über Ihre Konfigurationsdatei Speicherort weiß.

Verwandte Themen