2011-05-10 26 views
6

Después de muchas búsquedas sobre el tema, finalmente creo que la solución a mi problema es preguntarte.log4j postgres en Java EE

Así que mi problema está en el camino para crear registros en la utilización de mi aplicación web.

encontré la biblioteca java log4j, pero no entiendo cómo funciona ..

Dónde tengo que crear el archivo de configuración?

¿Dónde y cómo hacer referencia al respecto?

¿Puedo crear una clase que se conecte a postgres e inserte mis tres parámetros?

Aquí es lo que he encontrado en la red:

./src/log4j/log4j.properties

log4j.rootCategory = FATAL, CONSOLE 
# definition de l'appender console 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c - %m%n 

# definition de l'appender JDBC 
log4j.appender.JDBC=org.apache.log4j.jdbcplus.JDBCAppender 
log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout 
# appender pour base postgresql 
log4j.appender.JDBC.dbclass=org.postgresql.Driver 
# parametres de la base 
log4j.appender.JDBC.url=jdbc:postgresql://127.0.0.1:5432/baseSQL 
log4j.appender.JDBC.username=user 
log4j.appender.JDBC.password=password 
# requete sql qui decoupe le message suivant les barres verticales et fait l'insert dans la table 
log4j.appender.JDBC.sql=INSERT INTO logs (id, user, info1, info2, timestamp) VALUES (nextval('sequence_logs'), split_part('@[email protected]','|',1), split_part('@[email protected]','|',2), split_part('@[email protected]','|',3), '@[email protected]') 

#declaration des loggers de l'application 
log4j.logger.paquetage.de.mon.appli=FATAL, CONSOLE 
log4j.logger.loggerDB=INFO,JDBC 
# definition de non additivite des loggers 
log4j.additivity.loggerDB=false 

src/log4j/LogsInfos.java

package log4j; 

import org.apache.log4j.Logger; 

public final class LogsInfos { 

    /** Declaration du Logger DB. */ 
    private static Logger loggerDB = Logger.getLogger("loggerDB"); 

    /** 
    * Enregistre le log. 
    * @param param parametres du log 
    */ 
    public static void enregistreLog(String user, String action, String sujet) { 
//  Date date=new Date(); 
     if (loggerDB.isInfoEnabled()) { 
      // creation du message final 
      final String log = new StringBuffer(user).append(action).append(sujet).toString(); 
      // envoi du log au logger base 
      loggerDB.info(log); 
     } 
    } 
} 

la llamada en mi paquete

LogsInfos.enregistreLog((String)session.getAttribute("cn"),"Suppression",personne.getCn()); 

¿Puedo usar el objeto que desee?

Este código es la solución? si es así, ¿dónde tengo que llamar al archivo de configuración?

EDIT: Este es el mensaje de error de la consola en ejecución:

log4j:ERROR Could not instantiate class [org.apache.log4j.jdbcplus.JDBCAppender]. 
java.lang.ClassNotFoundException: org.apache.log4j.jdbcplus.JDBCAppender 
... 
log4j:ERROR Could not instantiate appender named "JDBC". 
log4j:WARN No appenders could be found for logger (loggerDB). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

Respuesta

3

Te faltan jdbcappender.jar en la ruta de clases. Creo que estás buscando this one. O puede ir con el official JDBCAppender, pero no estoy seguro si es una fuente poderosa para sus necesidades.

¿Dónde tengo que crear el archivo de configuración?

La mayoría de las personas lo crean at the application root, pero estoy seguro de que el suyo se está leyendo bien.

¿Dónde y cómo hacer referencia al respecto?

Realmente no necesita, si el archivo de configuración y las bibliotecas están en el classpath, todo lo que necesita es una instancia de Logger.

¿Puedo crear una clase que se conecte a postgres e inserte mis tres parámetros?

Sí. Estás en el camino correcto. Simplemente coloque los archivos necesarios en classpath y asegúrese de que su línea log4j.appender.JDBC.sql funcione. Utilizará los métodos de la clase Logger que se encargarán de todo por usted.

Cheers,

+0

Acabo de ver sus otras dos preguntas. Creo que tendrá que separar sus parámetros con pipes ("|") para que su línea sql de configuración funcione. Y creo que es bastante seguro reemplazar su StringBuffer con un StringBuilder más rápido (a menos que este código sea multiproceso de alguna manera) –

+0

'¿Puedo usar el objeto de mi elección?' Sí, pero como los está enviando a un StringBuffer, asegúrese anulan correctamente el método toString() o su resultado puede no ser el que está esperando. O tal vez malinterpreté tu pregunta. –