2011-05-17 340 views
6

我們使用Spring獲取我們所有的JDBC連接以及部分持久性框架。然而,爲了編寫我們自己的自定義數據庫appender(它必須是一個自定義的,因爲我們不允許使用由於表名稱標準的默認DBAppender)。我如何從自定義Appender內部獲得對spring bean/use autowire的引用?我寧願留在春天,而不是使用普通的JDBC。從自定義logback appender使用Spring?

自定義追加程序:

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

public class CustomDBAppender extends AppenderBase<ILoggingEvent> { 

    protected void append(ILoggingEvent event) { 

    } 

} 

回答

1

我這樣做的方式是使用AutowiredAnnotationBeanPostProcessor。

在你的appender的構造函數中,你要求AutowiredAnnotationBeanPostProcessor注入「this」。

我的意見在this article末尾詳述了這項技術。本文討論了一種類似的自動裝配Hibernate實體的方法。

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 
    } 
} 

我不知道你是否會遇到同樣的問題,但我不得不使用多步配置(described here),因爲我得到SLF4J的「substitue記錄器」錯誤消息(described here)。