2016-04-11 5 views
1

Ich betrachte eine log4j2.xml Konfiguration von Spring-Boot und sehen Sie die folgende Konfiguration (unwichtige Teile entfernt):

<Property name="PID">????</Property> 
<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property> 
<Property name="LOG_LEVEL_PATTERN">%5p</Property> 
<Property name="LOG_PATTERN"> 
    ... %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} 
    ... %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} 
</Property> 

Werfen wir einen Blick: ${LOG_LEVEL_PATTERN} ist klar, es löst auf die in der Zeile oben definierte Eigenschaft auf. Aber die nächsten zwei Variablenerweiterungen haben ein sys: Präfix, was genau macht das?

Noch wichtiger, wer macht die Auflösung dieser Variablen (insbesondere sys:)? Ist es Log4j2 spezifisch? Ist diese Erweiterung von Maven oder vielleicht die Spring Framework, die ich verwende?

Antwort

1

Werfen Sie einen Blick auf org.apache.logging.log4j.core.lookup. Insbesondere die Interpolator-Klasse und die SystemPropertiesLookup-Klasse.

Der Interpolator wird versuchen, die SystemPropertiesLookup zu verwenden, die

return System.getProperty(key); 

zurück, wenn das Ergebnis Null ist wird es dann einen Standard-Lookup versuchen, das ein MapLookup ist.

if (map == null) { 
      return null; 
    } 
    return map.get(key); 

Diese Karte ist die Karte, die im Eigenschaftsbereich in der Konfig definiert ist.

TLDR

Die Lookups von log4j2 Kern gehandhabt werden. Zuerst wird es versuchen und die Systemeigenschaft erhalten. Wenn keine Systemeigenschaft vorhanden ist, sucht sie nach einer Eigenschaft, die im Eigenschaftsbereich Ihrer Konfiguration definiert ist.

Verwandte Themen