Newsgroup: it.comp.java
Titolo: Log4j e i SocketAppender mortali

Scusate, ma sono l'unico che ha problemi con log4j?
Avevo notato tempo fa che ogni tanto la mia applicazione si bloccava, 
pensavo a bug di ogni tipo e mi sono creato un banale meccanismo per fare un 
dump dello stato dei miei vari thread (lo so, avrei potuto usare jstack ma 
sul pc finale c'� solo il jre...).
Ad ogni modo, guardando gli stacktrace ottenuti ho notato che alcuni thread 
effettivamente si bloccavano e ho scoperto questa cosa:
 
class=EventHandler state=BLOCKED
          org.apache.log4j.Category.callAppenders(Category.java:204)
          org.apache.log4j.Category.forcedLog(Category.java:391)
          org.apache.log4j.Category.debug(Category.java:260)
          EventHandler.setAlarmOn(EventHandler.java:812)
          >> waiting for org.apache.log4j.spi.RootLogger@168a6fe owned by 
DBManagerPanel
 
class=DBManager state=RUNNABLE
          java.net.SocketOutputStream.socketWrite0(Native Method)
          java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
          java.net.SocketOutputStream.write(SocketOutputStream.java:136)
          java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1838)
          java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1747)
          java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1460)
          java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
          java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
          java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
          org.apache.log4j.net.SocketAppender.append(SocketAppender.java:241)
          org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
          org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
          org.apache.log4j.Category.callAppenders(Category.java:206)
          org.apache.log4j.Category.forcedLog(Category.java:391)
          org.apache.log4j.Category.debug(Category.java:260)
          DBManager.run(DBManager.java:1872)
 
ovviamente guardando il mio codice alle righe segnalate, c'� una chiamata al 
metodo .debug() per loggare contenuto informativo, come mi aspettavo.
 
Le properties del mio log4j hanno il classico RollingFileAppender (per 
scrivere su file system) e un SocketAppender che uso per mostrare i messaggi 
in tempo reale in una dialog informativa... il problema � che la 
serversocket si mette in accept solo quando questa dialog � aperta, quindi 
non mi riesco a spiegare quel socketWrite0 nativo che cosa stia 
effettivamente facendo... come pu� scrivere o cercare di scrivere se non � 
nemmeno connessa la socket?
Ho dato un'occhiata col tcpview e si vede che ad intervalli regolari 
predefiniti (da configurazione) c'� una socket che tenta di collegarsi alla 
porta predefinita della serversocket, ma non trovandola sparisce subito... 
quindi che succede??
Qualcuno ha esperienza in merito e/o suggerimenti da dare?
 
Grazie
CarMas 
 

 Scusate, ma sono l'unico che ha problemi con log4j?
 
Direi di no... preoccupantissimi post in rete, tipo
http://jroller.com/oburn/entry/log4j_hangs_my_application