Newsgroup: it.comp.java
Titolo: Problemi con l'impostazione di log4j per JBoss

Salve a tutti.
Come ho postato anche nel forum di JBoss (dò il link perchè i pezzi di
codice li leggerete meglio lì 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4252264#4252264
)
sto cercando di configurare il log4j dell'AS facendo dipendere solo da
esso le istruzioni di log della mia web application.
La versione è la 4.2.2 GA ed il file in questione è il jboss-log4j.xml
che qui di seguito incollo:
******************** JBOSS-LOG4.XML BEGIN **********************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="
http://jakarta.apache.org/log4j/
"
debug="false">
   <!-- ================================= -->
   <!-- Preserve messages in a local file -->
   <!-- ================================= -->
   <!-- A time/date based rolling appender -->
   <appender name="FILE"
class="org.jboss.logging.appender.DailyRollingFileAppender">
      <errorHandler
class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="File" value="${jboss.server.log.dir}/server.log"/>
      <param name="Append" value="false"/>
      <!-- Rollover at midnight each day -->
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>
      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n
-->
         <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
      </layout>
   </appender>
   <!-- ============================== -->
   <!-- Append messages to the console -->
   <!-- ============================== -->
   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <errorHandler
class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="Target" value="System.out"/>
      <param name="Threshold" value="INFO"/>
      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n
-->
         <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c
{1}] %m%n"/>
      </layout>
   </appender>
    <appender name="sicrelAppender"
class="org.jboss.logging.appender.DailyRollingFileAppender">
      <errorHandler
class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="File" value="${jboss.server.log.dir}/sicrel.log"/>
      <param name="Append" value="false"/>
<param name="Threshold" value="DEBUG"/>
      <!-- Rollover at midnight each day -->
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>
      <layout class="org.apache.log4j.PatternLayout">
	      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
      </layout>
      <filter class="org.jboss.logging.filter.TCLFilter">
        <param name="AcceptOnMatch" value="true"/>
        <param name="DeployURL" value="sicrel.war"/>
     </filter>
   </appender>
   <!-- ================ -->
   <!-- Limit categories -->
   <!-- ================ -->
   <!-- Limit the org.apache category to INFO as its DEBUG is verbose
-->
   <category name="org.apache">
      <priority value="INFO"/>
   </category>
   <!-- Limit the jacorb category to WARN as its INFO is verbose -->
   <category name="jacorb">
      <priority value="WARN"/>
   </category>
   <!-- Limit the org.jgroups category to WARN as its INFO is verbose
-->
   <category name="org.jgroups">
      <priority value="WARN"/>
   </category>
   <!-- Limit the org.quartz category to INFO as its DEBUG is verbose
-->
   <category name="org.quartz">
      <priority value="INFO"/>
   </category>
   <!-- Limit the JSR77 categories -->
   <category name="org.jboss.management">
      <priority value="INFO"/>
   </category>
   <!-- Limit the org.jboss.serial (jboss-serialization) to INFO as
its DEBUG is verbose -->
   <category name="org.jboss.serial">
      <priority value="INFO"/>
   </category>
   <root>
      <appender-ref ref="CONSOLE"/>
      <appender-ref ref="FILE"/>
      <appender-ref ref="sicrelAppender"/>
   </root>
</log4j:configuration>
**************** JBOSS-LOG4J.XML END ***************************
E' in pratica quello originale a cui è stato aggiunto l'appender
    <appender name="sicrelAppender"
class="org.jboss.logging.appender.DailyRollingFileAppender">
      <errorHandler
class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="File" value="${jboss.server.log.dir}/sicrel.log"/>
      <param name="Append" value="false"/>
<param name="Threshold" value="DEBUG"/>
      <!-- Rollover at midnight each day -->
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>
      <layout class="org.apache.log4j.PatternLayout">
	      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
      </layout>
      <filter class="org.jboss.logging.filter.TCLFilter">
        <param name="AcceptOnMatch" value="true"/>
        <param name="DeployURL" value="sicrel.war"/>
     </filter>
   </appender>
ed il relativo ref nel tag <root>
Nel mio war, sicrel.war, oggetto del parametro DeployURL del filtro
dell'appender ho questa classe
public final class ProjectLogger {
	private final static Logger LOGGER;
	static {
		LOGGER = Logger.getLogger("");
		}
	public static Logger getLogger() {
		return LOGGER;
	}
}
e questi due pezzi di codice in una servlet
/* (1) */
		if (ProjectLogger.getLogger().isDebugEnabled()){
			ProjectLogger.getLogger().debug("Start");
		}
/* (2) */
		if (ProjectLogger.getLogger().isDebugEnabled()){
			ProjectLogger.getLogger().info("request.getRequestURI()
"+request.getRequestURI());
}
Bene, con
<param name="Threshold" value="INFO"/>
nel sicrelAppender,
il file sicrel.log contiene intanto anche il log di startup di JBoss;
inoltre, contiene il pezzo (2) del mio log, anche se è sottoposto alla
if isDebugEnabled() !
Con
<param name="Threshold" value="DEBUG"/>
nel sicrelAppender,
succede in pratica che i due file, sicrel.log e server.log sono
identici ed anche stavolta SOLO il pezzo(2) del mio log viene scritto.
In pratica vedo istruzioni di livello DEBUG del file per tutto tranne
per ciò che viene prodotto dal mio .debug().
Le domande sono quindi:
1) perchè i log di JBoss e della mia applicazione vengono fusi
insieme?
2) perchè mi scrive un .info() anche se sotto la if isDebugEnabled()
quando il threshold è INFO?
3) perchè il log di livello debug della mia applicazione non viene
scritto mai?
Grazie in anticipo.

 scritto mai?
Scusa, ho letto il tuo post un po' di fretta, ma ti faccio una domanda:
per quale motivo usi una stringa vuota come nome del logger? Non � che
magari la fonte di tutti i casini � proprio questa? Hai provato a
metterci un nome sensato, ad esempio il nome della tua applicazione?
Ciao
	Y.

         Y.
Guarda, per fare il test (qui non l'ho scritto) ho anche bypassato il
ProjectLogger ed in inserito un'istanza di Logger direttamente nella
classe che loggo.
Ossia una cosa del tipo Logger _log = Logger.getLogger
(nomeclasse.class)
_log.debug("Start")
_
log.info
(ecc. ecc);
Il risultato è lo stesso.

 Il risultato � lo stesso.
Se il tuo scopo � fare s� che la tua applicazione usi l'appender
"sicrelAppender" credo sia indispensabile nel codice dare un nome al
logger. Se usi il nome della classe come nome del logger (il che non �
indispensabile, puoi usare una stringa a piacere) nel jboss-log4j.xml
devi definire una categoria fatta in questo modo:
<category name="MyClass">
     <priority value="TRACE" />
     <appender-ref ref="sicrelAppender" />
   </category>
Io, almeno, per un progetto ho fatto cos� e la cosa ha funzionato.
	Y.

         Y.
No, non va.
Io ho come l'impressione che per quanto venga letto il contenuto di
jboss-log4j.xml (il file sicrel.log me lo crea) poi per l'impostazione
del mio log usa qualcos'altro.

 wrote:
Ho risolto.
Il problema era dato dalla priorità data dell'Appender FILE che aveva
INFO come threshold
Ora c'è un altro problema.
Vorrei loggare nel mio file le query di hibernate.
La sacra bibbia dice che
"When developing applications with Hibernate, you should almost always
work with debug enabled for the category org.hibernate.SQL, or,
alternatively,
the property hibernate.show_sql enabled."
Se abilito hibernate.show_sql le query vanno in System.out e quindi
non le intercetto col mio appender.
Se utilizzo una category del tipo (indipendentemente che
hibernate.show_sql sia true o false)
  <category name="org.hibernate">
     <priority value="DEBUG" />
     <appender-ref ref="sicrelAppender" />
   </category>
nel mio file di log non esce fuori nulla relativamente ad hibernate