2017-03-17 1 views
0

Ich verwende Spring Boot 1.5.2 mit Logback, die mit einem logback-spring.xml konfiguriert ist. Dort definiere ich einen Appender eines benutzerdefinierten Typs (Unterklasse RollingFileAppender) und möchte ein Paar Bohnen injiziert bekommen.Abhängigkeit Injektion in Logback Appender mit Spring Boot

Ist das möglich? Ich habe naiv versucht, den Appender @Component etc. zu kommentieren, aber wie es von Logback/Joran erstellt wird, funktioniert es natürlich nicht. Gibt es einen Trick, den ich anwenden kann?

Wenn nicht möglich, was wäre der kanonische Weg, um mein Ziel zu erreichen (Einfügen von Beans aus dem Anwendungskontext in einen Appender)?

Antwort

2

Es ist nicht möglich zu tun, was Sie versuchen zu tun. Die Protokollierung wird vor der Erstellung des Anwendungskontexts initialisiert, sodass die Abhängigkeitsinjektion nicht durchgeführt werden kann.

Vielleicht könnten Sie eine andere Frage stellen, in der Sie beschreiben, was Sie mit Ihrem Appender machen können? Es kann eine Lösung geben, bei der Spring-Beans nicht importiert werden.

+0

Gibt es eine Möglichkeit, einen Appender später hinzuzufügen, sobald der Anwendungskontext bereit ist? – wujek

+1

@wujek http://stackoverflow.com/questions/16910955/programmatisch-configure-logback-appender#17215011 –

0

Versuchen Sie, eine Bohne wie diese zu definieren und die statischen getBean Verfahren und fordert sie auf, anstelle der Verwendung von Dependency Injection:

@Component 
public class BeanFinderGeneral implements ApplicationContextAware { 

    private static ApplicationContext applicationContext; 

    public static <T> T getBean(Class<T> clazz) { 
     return applicationContext.getBean(clazz); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext pApplicationContext) throws BeansException { 
     applicationContext = pApplicationContext; 
    } 
} 
0

Im Frühjahr Boot können Sie eine Konfigurationsklasse schreiben und eine Bean Ihrer logback Klasse erstellen, wie unten:

@Component 
@Configuration 
public class LogBackObjectBuilder { 

@Bean 
public RollingFileAppender myRollingFileAppender() { 
    return new YOUR-SUB-CLASS-OF-RollingFileAppender(); 
} 
} 

Wenn diese Klasse nur von Frühling gescannt wird, wird diese Bean erstellt und in den Kontext injiziert. Ich hoffe ich habe deine Frage richtig verstanden. Sie möchten, dass der benutzerdefinierte Appender in den Anwendungskontext eingefügt wird.

0

Mit logback-extensions können Sie Ihre Appender in einer Spring-Anwendungskontextdatei oder in einer Spring-Config-Factory erstellen.

+0

Letzte commit: 10. September 2015. Ich hatte beschlossen, dies nicht zu verwenden, bevor ich fragte, aber trotzdem danke. – wujek

Verwandte Themen