2011-05-17 15 views
6

Utilizamos Spring para obtener todas nuestras conexiones JDBC y también como parte de nuestro marco de persistencia. Sin embargo, para escribir nuestro propio apéndice de base de datos personalizada (tiene que ser una costumbre, ya que no se nos permite usar el DBAppender predeterminado debido a los estándares de nombre de tabla). ¿Cómo puedo obtener una referencia a los granos de primavera/usar el autoencendido en este punto desde el interior del apilador personalizado? Preferiría quedarme en primavera en lugar de usar JDBC normal.¿Cómo utilizar Spring desde un appender de logback personalizado?

personalizada Appender de:

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

public class CustomDBAppender extends AppenderBase<ILoggingEvent> { 

    protected void append(ILoggingEvent event) { 

    } 

} 

Respuesta

1

La forma en que lo hago es usar AutowiredAnnotationBeanPostProcessor.

En el constructor de su apéndice, solicite al AutowiredAnnotationBeanPostProcessor que inserte "this".

Mis comentarios al final de this article detalla la técnica. El artículo habla sobre un método similar de autoenvío de entidades de Hibernate.

3

Así es como he resuelto el problema - me sale un método DataSource dentro del appender start a través de JNDI y luego crear mi JdbcTemplate. Me funcionó muy bien, sin problemas.

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

No sé si va a encontrarse con el mismo problema, pero tuve que usar la configuración de múltiples pasos (como described here) porque me estaba poniendo el mensaje de SLF4J "registrador substitue" error (described here).

Cuestiones relacionadas