弹簧启动 + 登录 + 自动连线



我正在运行一个使用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);
    }   
}

根据文档,我知道"日志记录系统在应用程序的早期初始化......"

想知道我必须做什么才能在我的追加器中提供 rabbitTemplate。

你的追加器不是 Spring bean,它是由 logback 框架实例化的。你不能使用 Spring 的依赖注入(@Component@Autowired不会被处理)。你需要显式实例化你的 RabbitTemplate。

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

我玩了一会儿,让它工作:

@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();
    }
}

假设您不介意以编程方式配置追加器,它可以为您解决问题。然后.xml您无需触摸登录。

我遇到了完全相同的问题。但是,在应用您的代码后,我的自动连线字段仍然为空:-(?有什么我应该检查的吗?

这是我的代码:

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();
    }    
}

当你说"不要碰回点.xml"时,你的意思是根本没有它还是只是保持原样?当我保留它时,我为自动连线字段为空。当没有它时,我的附加器根本没有被使用。

最新更新