如何在自定义的logback appender中使用Spring?

6
我们使用Spring来获取所有的JDBC连接以及我们持久性框架的一部分。但是,为了编写我们自己的自定义DB appender(必须是自定义的,因为我们不允许使用默认的DBAppender,由于表名标准),我该如何在自定义appender内部获取对Spring bean的引用/使用autowire?我更喜欢在Spring中保留而不是使用纯JDBC。
自定义Appender:
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

public class CustomDBAppender extends AppenderBase<ILoggingEvent> {

    protected void append(ILoggingEvent event) {

    }

}
3个回答

3

这是我解决问题的方法 - 我通过 JNDI 在 appender 的 start 方法中获取一个 DataSource,然后创建我的 JDBCTemplate。这对我来说非常有效 - 没有任何问题。

public class MyAppender extends AppenderBase<ILoggingEvent>
{
  private String _jndiLocation;
  private JDBCTemplate _jt;

  public void setJndiLocation(String jndiLocation)
  {
    _jndiLocation = jndiLocation;
  }

  @Override
  public void start()
  {
    super.start();

    if (_jndiLocation == null)
    {
      throw new IllegalStateException("Must have the JNDI location");
    }
    DataSource ds;
    Context ctx;
    try
    {
      ctx = new InitialContext();
      Object obj = ctx.lookup(_jndiLocation);
      ds= (DataSource) obj;

      if (ds == null)
      {
        throw new IllegalStateException("Failed to obtain data source");
      }
      _jt = new JDBCTemplate(ds);
    }
    catch (Exception ex)
    {
      throw new IllegalStateException("Unable to obtain data source", ex);
    }

  }

  @Override
  protected void append(ILoggingEvent e)
  {
    // log to database here using my JDBCTemplate instance
  }
}

我不知道你是否会遇到相同的问题,但我必须使用多步配置(如这里所述),因为我一直收到SLF4J的“替代日志记录器”错误消息(在这里描述)。


1

1

我通常使用AutowiredAnnotationBeanPostProcessor来实现。

在你的appender构造函数中,你可以请求AutowiredAnnotationBeanPostProcessor注入“this”。

本文末尾有我的评论详细介绍了这种技术。该文章讨论了一种类似的自动装配Hibernate实体的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接