web-dev-qa-db-de.com

Verwenden Sie die Eigenschaften der Spring-Startanwendung in log4j2.xml

Ich arbeite an einer Webanwendung, die auf Spring Boot basiert, und möchte log4j2 als Logger-Implementierung verwenden.
Alles funktioniert gut mit der Protokollierungskonfiguration, die in einer log4j2-spring.xml -Datei definiert ist. 

Was funktioniert nicht: Ich möchte in der Datei log4j2-spring.xml Eigenschaftsplatzhalter verwenden, die aus den in der application.yml -Datei definierten Eigenschaften aufgelöst werden sollten, die für die Konfiguration des Spring Boot verwendet werden. 

Ist das möglich? Wenn ja, wie?

5
Ankit Gupta

Das direkte Ersetzen von Eigenschaften in log4j2-spring.xml über den Platzhalter für Eigenschaften ist nicht möglich, da der log4j2-spring.xml außerhalb des Bereichs von Spring liegt und nur zu Konfigurationszwecken verwendet wird.

Sie können jedoch die Log4j2 Out-of-Box-Funktion der Eigenschaftssubstitution wie in hier beschrieben einsetzen.

Schritt 1 - Geben Sie den Namen der Eigenschaft und ihre Variable in log4j2-spring.xml wie folgt an 

<Configuration status="warn">
    <Properties>
        <Property name="someProp">${bundle:test:someKey}</Property>
    </Properties> 
    <!--other configs -->
</Configuration>

Schritt 2 - Verwenden Sie die oben definierte Eigenschaft in der Protokollkonfiguration z. B. Suffix zum Protokolldateinamen

<Appenders>
    <File name="file" fileName="/path/to/logs/app-${someProp}.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %-40c{1.} - %m%n"/>
    </File>
</Appenders>

Schritt 3 - Erstellen Sie ein Bundle (dh Eigenschaftendatei), um den Eigenschaftswert z. B. test.propertiesaufzunehmen.

# properties for log4j2
someKey=someValue
someKey1=someValue1

In Ihrem Fall enthält diese Datei die Werte in yaml, die Sie in der Konfiguration von log4j2 verwenden möchten. Wenn diese Eigenschaften auch in der Anwendung verwendet werden, werden sie in yaml dupliziert und das Bundle (d. H. Eigenschaftendatei) sollte ein akzeptabler Kompromiss sein, da der Frühling sie nicht in log4j2-Konfiguration einspritzen kann.

Lassen Sie es in Kommentaren wissen, wenn weitere Informationen erforderlich sind.

3

Ich hatte ein ähnliches Problem mit dem Einfügen von Spring Boot-YAML-Eigenschaften in die log4j-XML-Konfiguration, und ich habe eine Lösung für Spring Boot 1.5.X (und wahrscheinlich 2,0, die ich nicht getestet habe) gefunden, die ein bisschen hackig ist und auf dem System ausgeführt wird Eigenschaften Lookup, aber es funktioniert sicherlich. 

Nehmen wir an, Sie haben das Profil "dev" in Ihrer Anwendung und einige Eigenschaften zum Einfügen. Dann sieht Ihre application-dev.yml so aus:

property:
    toInject: someValue

In Ihrer XML-Konfiguration log4j2-spring-dev.xml setzen Sie etwas wie folgt:

<Properties>
    <property name="someProp">${sys:property.toInject}</property>
</Properties>

Nun müssen Sie diese Federeigenschaft irgendwie auf die Systemeigenschaft übertragen. Sie müssen dies tun, nachdem die Anwendungsumgebung vorbereitet und das Protokollierungssystem initialisiert wurde. In Spring Boot gibt es einen Listener LoggingApplicationListener, der das gesamte Protokollierungssystem initialisiert und durch das Ereignis ApplicationEnvironmentPreparedEvent ausgelöst wird. Erstellen Sie also einen Listener mit einer Reihenfolge mit höherer Priorität als LoggingApplicationListener:

public class LoggingListener implements ApplicationListener, Ordered {

@Override
public int getOrder() {
    return LoggingApplicationListener.DEFAULT_ORDER - 1;
}

@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ApplicationEnvironmentPreparedEvent) {
        ConfigurableEnvironment environment = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment();
        List<String> activeProfiles = Arrays.asList(environment.getActiveProfiles());
        if (!activeProfiles.contains("dev")) {
            return;
        }

        String someProp = environment.getProperty("property.toInject")
        validateProperty(someProp);

        System.setProperty("property.toInject", someProp);
    }
}

Registrieren Sie jetzt diesen Listener in Ihrer Anwendung: 

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(MyApplication.class);
    application.addListeners(new LoggingListener());
    application.run(args);
}

Und das ist es. Ihre Spring Boot-Eigenschaften sollten in Ihre log4j2-Konfigurationsdatei eingefügt werden. Diese Lösung funktioniert mit Klassenpfad-Eigenschaften und --spring.config.location-Eigenschaften. Beachten Sie, dass dies nicht mit einem externen Konfigurationssystem wie Spring Cloud Config möglich ist.

Ich hoffe es hilft 

1
DG94