2017-05-23 2 views
3

In meiner Log4j2 Config-Datei, ich habe dies:Erste Eigenschaften programmatisch von Log4j2 XML-Konfigurations

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN" strict="true" name="XMLConfig" packages="org.apache.logging.log4j.test"> 
    <Properties> 
     <Property name="baseDir">log-dir/</Property> 
     <Property name="defaultLogfileName">default-log-file</Property> 
    </Properties> 

Jetzt in einigen meiner Code, erstelle ich benutzerdefinierte Logger. Ich muss auf den Wert von "baseDir" zugreifen und es ändern. Ich habe versucht, mit getProperties aus dem Zusammenhang wie folgt aus:

LoggerContext context = (LoggerContext) LogManager.getContext(false); 
Configuration configuration = context.getConfiguration(); 
configuration.getProperties(); 

Aber die Karte, die hat kommt wieder die Schlüssel „Hostnamen“ und „context“. Nicht die Eigenschaften, nach denen ich gesucht habe.

Ich dachte, dass ich im Stande sein könnte es von der rootLogger zu bekommen:

LoggerContext context = (LoggerContext) LogManager.getContext(false); 
Configuration configuration = context.getConfiguration() 
for (Property p : configuration.getRootLogger().getPropertyList()) 
{ 
    ... 
} 

Aber das ergibt eine Nullpointer weil getPropertyList null zurückgibt.

Also, wie kann ich auf die Eigenschaft mit dem Namen "BaseDir" zugreifen, so dass ich programmgesteuert einen neuen Logger erstellen kann, aber mit einem anderen Basisverzeichnis?

+0

Es funktioniert nicht für mich. https://StackOverflow.com/questions/46581587/log4j2-xml-define-jdbc-appender-and-pass-property-from-xml-configuration – AleMar

Antwort

2

Die Klasse Konfiguration, die durch context.getConfiguration() zurückgegeben wird ist nicht eine Art PropertyConfiguration Klasse. Es kann nicht für den Zugriff auf log4j2.xml-Werte verwendet werden, da es sich um eine sehr unterschiedliche Konfiguration-Klasse handelt, die auf Protokollierungseinstellungen zugeschnitten ist.

Es ist möglich, baseDir Definition in separate Eigenschaftendatei zu extrahieren. Dies stellt die gemeinsame Quelle sowohl für die programmgesteuerte als auch für die nicht programmatische log4j-Konfiguration dar: programmatisch kann auf sie als eine normale Eigenschaftskonfigurationsdatei zugegriffen werden; Die log4j2-Konfiguration kann auf sie als Eigenschaftensuche zugreifen.

Das sieht etwa so aus:

  1. Die externe Eigenschaftsdatei logsCommons.properties im selben Ordner mit log4j2 befindet.und XML hat die Eigenschaft:

    baseDir=log-dir 
    
  2. Die log4j2xml wird wie folgt definiert:

    <Properties> 
        <Property name="baseDir">${bundle:logsCommons:baseDir}/</Property> 
        <Property name="defaultLogfileName">default-log-file</Property> 
    </Properties> 
    

vom OP:

Neben den Wert Bewegen von baseDir zu einer Eigenschaftendatei und verweist darauf als ${bundle:logsCommon:baseDir} als oben beschrieben, habe ich dies zu meiner eigentlichen Lösung zu erhalten:

erhalten den StrSubstitutor:

String baseDirVar = configuration.getStrSubstitutor().getVariableResolver().look‌​up("baseDir"); 

Dann brauchte ich einen Ersatz zu tun:

String baseDir = configuration.getStrSubstitutor().replace(baseDirVar); 

Jetzt kann ich zuverlässig erhalten (und Ändern Sie bei Bedarf das Basisverzeichnis für die Protokollierung, das jetzt aus der Eigenschaftendatei stammt.

+0

Bedeutet dies, dass mein Code auf 'baseDir' zugreifen müsste, indem er die Eigenschaftendatei? Oder kann ich über die log4j2 API darauf zugreifen? – FrustratedWithFormsDesigner

+0

Ich habe es herausgefunden! Zuerst musste ich den StrSubstitutor holen: 'String baseDirVar = configuration.getStrSubstitutor(). GetVariableResolver(). Lookup (" baseDir ");' Dann musste ich einen Ersatz machen: 'String baseDir = configuration.getStrSubstitutor(). Replace (baseDirVar); 'Jetzt kann ich das Basisverzeichnis für die Protokollierung, das jetzt aus der Eigenschaftendatei kommt, zuverlässig abrufen (und bei Bedarf ändern). – FrustratedWithFormsDesigner

Verwandte Themen