IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Logging Java Discussion :

[Log4J] JDBCAppender + Hibernate avec JNDI


Sujet :

Logging Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Par défaut [Log4J] JDBCAppender + Hibernate avec JNDI
    Bonsoir !

    Pour un nouveau projet web basé sur le Framework Struts², je veux configurer Log4J pour organiser mes logs.

    Pour cela, j'aimerais notamment logger les erreurs dans une table en base de données.
    Mon projet utilise également Hibernate 3 pour tout ce qui est DAO, DTO, ...

    J'aimerais centraliser les initialisations des config des connexion à la base de données en déclarant une datasource JNDI, que j'utiliserais au niveau d'Hibernate et Log4J lors de la config.

    Si quelqu'un a déjà mis en place un tel dispositif, j'aimerais un peu d'aide sur la config et l'architecture, à savoir :

    1) A quel niveau déclarer la DataSource
    2) Comment déclarer mon JDBCAppender pour utiliser la DataSource ?
    3) Où placer mon fichier de config Log4J.xml ?
    4) Comment configurer Hibernate3 pour utiliser la même DataSource ?
    5) Où placer le fichir de config Hibernate ?

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Par défaut
    Bon alors j'ai en partie trouvé comment faire, y a pas mal de doc sur le net.
    Il faut tout d'abord déclarer la dataSource dans le context.xml.
    Chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="/appname">
      <Resource auth="Container" 
                name="jdbc/appnameDS" 
                driverClassName="com.mysql.jdbc.Driver" 
                type="javax.sql.DataSource" 
                url="jdbc:mysql://localhost:3306/dbname" 
                username="root" 
                password="password" 
                maxActive="30" 
                maxIdle="10" />
    </Context>
    Puis il faut y faire référence dans le web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <web-app ...>
     <resource-ref>
            <res-ref-name>jdbc/appnameDS</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
        </resource-ref>
        </web-app>
    ensuite il faut se créer sa propre classe JDBCAppender qui extends le JDBCAppender de log4J :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class JDBCDataSourceAppender extends JDBCAppender 
    {    
        private String dataSource = null;
     
        /** Creates a new instance of JDBCDataSourceAppender */
        public JDBCDataSourceAppender() 
        {
            super();
        }
     
        public String getDataSource() { return dataSource; }
     
        public void setDataSource(String dataSource) { this.dataSource = dataSource; }
     
        protected Connection getConnection() 
        {
            if (this.dataSource == null)
            {
                LogLog.error("no dataSource initialized");
                return null;
            }
     
            try
            {
                if (this.connection == null)
                {
                    Context initContext = new InitialContext();
                    Context envContext = (Context) initContext.lookup("java:/comp/env");
                    DataSource ds = (DataSource) envContext.lookup(this.dataSource);
                    this.connection = ds.getConnection();
                }
                this.connection.setAutoCommit(true);
            }
            catch (NamingException ne)   { LogLog.error(ne.getExplanation()); }
            catch (SQLException    sqle) { LogLog.error("error while getting connection: " + sqle.getMessage()); }
     
            return this.connection;
        }
     
    }
    Et enfin il faut configurer le log4J.xml pour qu'il utilise notre Appender :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <appender name="Jdbc1" class="monpackage.JDBCDataSourceAppender">
            <param name="Threshold" value="ERROR"/>
            <param name="dataSource" value="jdbc/appnameDS"/>
            <param name="sql" value="insert into log (user, module, function, date, level, type, message) values ('APPLI', '%c{1}', '%M()', '%d{yyyy-MM-dd HH:mm:ss}', case '%p' when 'TRACE' then 0 when 'DEBUG' then 1 when 'INFO' then 2 when 'WARN' then 3 when 'ERROR' then 4 when 'FATAL' then 5 else 9 end, '%p', '%m')"/>
        </appender>
    Sans oublier de mettre mysql-connector.jar dans common/lib de tomcat si ce n'est pas déjà fait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Hibernate: erreur JNDI
    Par Thi0123 dans le forum Hibernate
    Réponses: 9
    Dernier message: 26/08/2011, 09h28
  2. Logger Hibernate avec Log4j ?
    Par pontus21 dans le forum Hibernate
    Réponses: 0
    Dernier message: 21/07/2009, 09h51
  3. Entité Hibernate non trouvé avec jndi
    Par *alexandre* dans le forum Hibernate
    Réponses: 10
    Dernier message: 21/11/2008, 13h39
  4. Question pour Hibernate avec une DataSource
    Par akademiks dans le forum Hibernate
    Réponses: 4
    Dernier message: 28/08/2006, 23h17
  5. Problème de connexion SqlServer avec JNDI
    Par s.lakhlifi dans le forum JDBC
    Réponses: 5
    Dernier message: 09/06/2006, 13h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo