2011-10-05 4 views
2

Existe-t-il un moyen de modifier les tables que le journal écrit ses données en utilisant dbAppender? Il a trois tables par défaut qui doivent être créées avant d'utiliser dbAppender, mais je veux le personnaliser pour écrire dans une table de mon choix. Quelque chose de similaire à Log4J où je peux spécifier le SQL qui est exécuté lors de l'insertion du journal dans la base de données.Logback dbAppender SQL personnalisé

+0

duplication possible de [DBAppender - comment changer les noms de tables par défaut?] (Http://stackoverflow.com/questions/4690381/dbappender-how-to-change-default-table-noms) –

Répondre

0

Vous devez mettre en œuvre ch.qos.logback.classic.db.names.DBNameResolver et de l'utiliser dans la configuration:

<appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> 
    <dbNameResolver class="com.example.MyDBNameResolver"/> 
    <!-- ... --> 
</appender> 
+0

Salut, Merci pour votre réponse, savez-vous où il y a des exemples de cela mis en œuvre, j'ai implémenté le DBNameresolver mais je ne suis pas sûr de ce que les méthodes prennent et quoi ils reviennent. – Magezy

+0

Par défaut, cette classe prend une instance de 'ch.qos.logback.classic.db.names.ColumnName' et renvoie le nom de chaque valeur enum. Regardez deux implémentations disponibles dans la distribution de Logback. S'il vous plaît déposer un problème pour documenter cette fonctionnalité. –

3

Tomasz, peut-être je manque quelque chose, mais je ne vois pas comment utiliser simplement DBNameResolver personnalisé pourrait être la réponse à ce Magezy demandé . DBNameResolver est utilisé par DBAppender via SQLBuilder pour construire 3 requêtes d'insertion SQL - via DBNameResolve on peut seulement affecter les noms des tables et des colonnes où les données seront insérées, mais ne peut pas limiter l'insertion à une seule table, sans parler de DBNameResolver ne sont aucun moyen de contrôler ce qui est réellement inséré.

Pour correspondre à JDBCAppender IMO de log4j, il faut étendre DBAppender, ou DBAppenderBase de logback, ou peut-être même implémenter entièrement nouveau Appender personnalisé.

1

La façon la plus simple pour moi était de créer un appender à partir de zéro. J'ajoute à une seule table, en utilisant Spring JDBC. Il fonctionne comme ceci:

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

j'ai rencontré des problèmes avec SLF4J - l'erreur de l'enregistreur de remplacement décrit ici: http://www.slf4j.org/codes.html#substituteLogger

This thread on multi-step configuration m'a permis de contourner ce problème.

1
<appender name="CUSTOM_DB_APPENDER" class="com.....MyDbAppender"> 
     <filter class="com......MyFilter"/> 
     <param name="jndiLocation" value="java:/comp/env/jdbc/....MyPath"/> 
</appender> 

Et votre java MyDbAppender devrait avoir une chaîne jndiLocation avec setter. Maintenant faire une recherche jndi (voir la réponse à la réponse du 17 octobre 11 à 16:03)