Newsgroup: it.comp.java
Titolo: Domanda LOG4J

Ciao a tutti
Ho due applicazioni web (due .war) che girano all'interno della stessa JVM.
Entrambe le applicazioni utilizzano LOG4J per le attività di logging ed
entrambe utilizzano una libreria di classi (un framework).
fin qui .... tutto a posto.
Il problema sorge quando si cerca di configurare LOG4J in modo da tracciare
una classe del framework in maniera diversa nelle due applicazioni. Quindi
se nell'applicazione A io volessi tracciare il livello di un package a DEBUG
e nell'applicazione B a WARNING, quando la definizione della seconda
applicazione (cioè quella caricata per seconda e NON necessariamente
l'applicazione B) va a sovrascrivere le definizione caricate nella prima.
Questo succede perchè LOG4J utilizza una classe statica (e quindi unica per
JVM) per tenere traccia dei livelli di log da assegnare ai package, quindi
nella seconda applicazione (che utilizzando lo stesso framework, utilizza
anche gli stessi package) vengono sovrascritte le definizioni della prima.
Qualcuno ha un'idea su come risolvere il problema ?
Spero di essere stato chiaro. Grazie a tutti

Ciao,
per aggirare l'inconveniente noi abbiamo creato una nuova classe che 
dovrebbe fare ciň che ti interessa. Prova a vedere se fa al caso tuo.
Spero di esserti stato utile,
Eta
import org.apache.log4j.FileAppender;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.dom4j.Node;
import java.io.IOException;
public class LoggerFactory {
     static private FileAppender fileAppender;
     static private Level logLevel = Level.ALL;
     public static void setLogger(String applicationName, String fileName) {
         HTMLLayout htmlLayout = new HTMLLayout();
         htmlLayout.setTitle(applicationName);
         Layout layout = htmlLayout;
         try {
             fileAppender = new FileAppender(layout, fileName, true);
         } catch (IOException e4) {
             e4.printStackTrace();
         }
     }
     public static void setLogger(String applicationName, Node loggerConfig,
         String fileName) {
         Layout layout;
         if (loggerConfig.valueOf("@layout").equalsIgnoreCase("html")) {
             HTMLLayout htmlLayout = new HTMLLayout();
             htmlLayout.setTitle(applicationName);
             layout = htmlLayout;
         } else {
             layout = new SimpleLayout();
         }
         try {
             fileAppender = new FileAppender(layout, fileName,
 
loggerConfig.valueOf("@append").equalsIgnoreCase("yes"));
         } catch (IOException e4) {
             e4.printStackTrace();
         }
         String level = loggerConfig.valueOf("@level");
         if (level.equalsIgnoreCase("info")) {
             logLevel = Level.INFO;
         } else if (level.equalsIgnoreCase("warn")) {
             logLevel = Level.WARN;
         } else if (level.equalsIgnoreCase("all")) {
             logLevel = Level.ALL;
         } else {
             logLevel = Level.DEBUG;
         }
     }
     public static Logger getLogger(String className) {
         return getLogger(className, logLevel);
     }
     public static Logger getLogger(String className, Level level) {
         Logger log = Logger.getLogger(className);
         if (fileAppender != null) {
             log.addAppender(fileAppender);
         }
         log.setLevel(level);
         return log;
     }
}

 Qualcuno ha un'idea su come risolvere il problema ?
Le due applicazioni sono ambienti separati, quindi se metti 2 files 
log4j.properties diversi dei 2 WEB-INF/classes ottieni quello che vuoi.
E' vero che Log4J usa classi statiche ma ogni applicazione ha il proprio 
classloader (io ho esperienza solo di Weblogic e Tomcat, ed in entrambi 
e' cosi').
ciao
Simone Pierazzini