package org.lilie.services.eliot.utils
-import org.apache.log4j.FileAppender
import org.apache.log4j.spi.LoggingEvent
import org.apache.log4j.Layout
+import org.apache.log4j.ConsoleAppender
/**
* Permet de retrouver les méthodes eliot groovy qui lancent les requete sql
* @author othe
*/
-class EliotSqlFileAppender extends FileAppender {
+class EliotSqlFileAppender extends ConsoleAppender {
private static final String BINDING = 'binding'
private static final String RETURNING = 'returning'
String message = event.message.toString()
if ((message.indexOf(BINDING) == -1) && (message.indexOf(RETURNING) == -1)) {
- logStacktrace()
+ logStacktrace(message)
}
subAppend(event)
}
- private static final REPERE = "<LOGSQL>"
- //private static final FERMETURE = "</LOGSQL>"
- private static final PILE_VIDE = REPERE + "pile vide"
- private static final APPEL_INTROUVABLE = REPERE + "appel eliot introuvable"
+ private static final OUVERTURELOG = "<TR>"
+ private static final FERMETURELOG = "</TR>"
+
+ private static final OUVERTUREMESSAGE = '<TD width="85%">'
+ private static final FERMETUREMESSAGE = "</TD>"
+
+ private static final OUVERTUREAPPEL = '<TD width="10%">'
+ private static final FERMETUREMAPPEL = "</TD>"
+
+ private static final OUVERTURELIGNE = '<TD width="5%">'
+ private static final FERMETURELIGNE = "</TD>"
+
+ private static final PILE_VIDE = "pile vide"
+ private static final APPEL_INTROUVABLE = "appel introuvable"
private static final ELIOT_FILE_APPENDER = "EliotSqlFileAppender"
private static final ELIOT = 'eliot'
- //private static final NL = "\n"
/**
* Log pile d'appel eliot
*/
- private void logStacktrace() {
+ private void logStacktrace(String msg) {
Throwable pile = new Throwable()
StackTraceElement[] elements = pile.stackTrace
int nombreElement = elements.length
if (nombreElement == 0) {
- String pilevide = PILE_VIDE + Layout.LINE_SEP
+ String pilevide = construireMessage(msg, PILE_VIDE, "")
this.qw.write(pilevide.toCharArray())
return
}
ligneEliot = true
- String message = REPERE +
+ String message = construireMessage(
+ msg,
cls +
- "." +
- element.methodName +
- "(..) [" + element.lineNumber.toString() + "]" +
- Layout.LINE_SEP
+ "." +
+ element.methodName +
+ "(..)",
+ element.lineNumber.toString()
+ )
this.qw.write(message.toCharArray())
break
}
if (!ligneEliot) {
- String pilevide = APPEL_INTROUVABLE + Layout.LINE_SEP
- this.qw.write(pilevide.toCharArray())
+ String appelIntrouvable = construireMessage(msg, APPEL_INTROUVABLE, "")
+ this.qw.write(appelIntrouvable.toCharArray())
}
}
+ private String construireMessage(String message, String methode, String ligne) {
+ return noNL(OUVERTURELOG +
+ OUVERTUREMESSAGE +
+ tokenizeSQL(message) +
+ FERMETUREMESSAGE +
+ OUVERTUREAPPEL +
+ methode +
+ FERMETUREMAPPEL +
+ OUVERTURELIGNE +
+ ligne +
+ FERMETURELIGNE +
+ FERMETURELOG
+ ) + Layout.LINE_SEP
+ }
+
+ private String tokenizeSQL(String sql) {
+ String resultat = ""
+ StringTokenizer st = new StringTokenizer(sql)
+
+ while (st.hasMoreTokens()) {
+ String key = st.nextToken()
+ if (isKeyWord(key)) {
+ resultat = resultat + "<b>" + key + "</b> "
+ } else {
+ resultat = resultat + key + " "
+ }
+ }
+
+ return resultat.trim()
+ }
+
+ private Boolean isKeyWord(String word) {
+ String internal = word.toUpperCase()
+ boolean resultat = false
+ SQLKEYWORDS.each {
+ if (it == internal) {
+ resultat = true
+ }
+ }
+
+ return resultat
+ }
+
+ private String noNL(String ligne) {
+ String resultat = ligne.replace('\n', ' ')
+ return resultat
+ }
+
+ private static final SQLKEYWORDS = ['SELECT', 'UPDATE', 'INSERT', 'DELETE', 'FROM', 'WHERE', 'INNER', 'LEFT', 'JOIN', 'RIGHT', 'OR', 'AND', 'WITH', 'AS', 'ON', 'IS', 'NULL','CASE','WHEN','EXISTS']
+
}
import org.lilie.services.eliot.environnement.EnvironnementUtil
import org.apache.log4j.DailyRollingFileAppender
import org.apache.log4j.FileAppender
+import org.lilie.services.eliot.utils.EliotSqlFileAppender
// Fréquence de sauvegarde de l'état du front-office (1 sauvegarde toutes les xxx ms)
// Remarque 1: la sauvegarde n'est déclenchée qu'en cas de modification
file: "/tmp/${appName}.log",
layout: pattern(conversionPattern: '%d [%t] %p %m%n')
)
- appender new FileAppender(
+ appender new EliotSqlFileAppender(
name: "sqlRequetes",
- file: "/tmp/${appName}-sqlRequetes.log",
+ target: stdout,
layout: pattern(conversionPattern: '%d [%t] %p %m%n')
)
}
def sqlRequetes = ['org.hibernate.SQL']
def sqlParams = ['org.hibernate.type']
-/*
debug additivity: false,
stdout: classesEliot + sqlRequetes,
applicatif_dev: classesEliot,
sqlRequetes: sqlRequetes
-*/
trace additivity: false,
sqlRequetes: sqlParams,