Spring Boot + logback + autowire

时间:2016-02-17 19:55:52

标签: spring spring-boot logback

我正在运行使用logback的Spring Boot应用程序。我们的想法是将日志消息发送到RabbitMQ服务器。为此,我创建了一个扩展ch.qos.logback.core.AppenderBase的appender。

这是我的logback-spring.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="messaging" class="com.foo.logging.appender.MessagingAppenderLogback" />
    <root level="info">
        <appender-ref ref="messaging" />
    </root>
</configuration>

一切都很好。但是,在MessagingAppenderLogback中,我希望用来发送消息的RabbitTemplate为空。

@Component
public class MessagingAppenderLogback extends AppenderBase<ILoggingEvent> {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public MessagingAppenderLogback(){ }

    @Override
    protected void append(ILoggingEvent event) {
        System.out.println("  MessagingAppenderLogback#append w/ event " + event);
        // rabbitTemplate.convertAndSend(event);
    }   
}

根据documentation,我知道&#34;日志系统在应用程序的早期初始化...&#34;

我想知道我必须做些什么才能在我的appender中使用rabbitTemplate。

3 个答案:

答案 0 :(得分:2)

你的appender不是一个Spring bean,它是由一个logback框架实例化的。您无法使用Spring的依赖注入(@Component@Autowired未处理)。您需要明确地实例化RabbitTemplate。

无论如何,你可能正在寻找这个: http://docs.spring.io/spring-amqp/docs/current/api/org/springframework/amqp/rabbit/logback/AmqpAppender.html

答案 1 :(得分:2)

我玩了一会儿,然后开始工作:

@Component
public class BeanAppender extends AppenderBase<ILoggingEvent> {

    @Autowired
    private UserService userService;

    @Override
    protected void append(ILoggingEvent eventObject) {
        System.out.println("message " + eventObject.getMessage() + " " + eventObject.getLoggerName() + " bean reference" + userService);
    }

    @PostConstruct
    public void init() {
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        context.getLoggerList().forEach(new Consumer<Logger>() {

            @Override
            public void accept(Logger logger) {
                logger.addAppender(BeanAppender.this);
            }
        });

        setContext(context);
        start();
    }
}

假设您不介意以编程方式配置appender,它可以为您提供帮助。您不需要触摸logback.xml。

答案 2 :(得分:0)

我遇到了完全相同的问题。但是,在应用您的代码后,我的自动连接字段仍为空:-(?我应该检查的任何内容?

这是我的代码:

import java.util.Date;
import java.util.function.Consumer;

import javax.annotation.PostConstruct;

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Component;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

@Component
@EnableAutoConfiguration
public class RabbitMQAppender extends AppenderBase<ILoggingEvent>
{
    @Autowired
    private EventPublisher eventPublisher;

    public RabbitMQAppender()
    {
    }

    @Override
    protected void append(ILoggingEvent logEvent)
    {
        System.out.println("RabbitMQ logger in appender: " + event.toString());
    }

    @PostConstruct
    public void init() {
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        context.getLoggerList().forEach(new Consumer<Logger>() {

            @Override
            public void accept(Logger logger) {
                logger.addAppender(RabbitMQAppender.this);
            }
        });

        setContext(context);
        start();
    }    
}

当你说&#34;不要触及logback.xml&#34;时,你的意思是根本没有它或只是保持原样吗?当我保留它时,我的自动装配字段为空。如果没有它,我的appender根本就没用了。