Log4j ist hängen meine Anwendung was mache ich falsch?
Zuerst etwas über den hintergrund der Anwendung. Ich habe eine Anwendung die Verarbeitung viele unabhängige Aufgaben parallel über einen thread-pool. Der thread-pool ist jetzt Aufhängen.
Folgende ist ein Ausschnitt aus meinem thread-dumps, alle meine Threads im pool-2 BLOCKIERT werden, die von "pool-2-thread-78". Es scheint geschlossen zu sein versuchen zu schreiben, die Konsole, die ich äußerst seltsam. Kann jemand alle vergossen Licht auf die situation für mich?
BEARBEITEN:
Plattform details
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
Ubuntu-Linux-server, dual-quad-core-Maschine.
Scheint es zu sperren, wenn das schreiben der printstream, ich habe als nur das entfernen der console appender aber ich würde lieber wissen, warum es blockiert ist und entfernen Sie es, auf diesem wissen basieren. In der Vergangenheit war das entfernen und sehen, ob es funktioniert hat komm zurück zu beißen mich 🙂
entsprechenden Abschnitt aus meiner log4j
log4j.rootLogger=DEBUG, STDOUT
log4j.logger.com.bla=INFO, LOG
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.LOG=org.apache.log4j.FileAppender
Thread-dump extrahieren
"pool-2-thread-79" Id=149 BLOCKIERT
org.apache.log4j.spi.RootLogger@6c3ba437
im Besitz von "pool-2-thread-78" Id=148 an
org.apache.log4j.Kategorie.callAppenders(Kategorie.java:201)
bei
org.apache.log4j.Kategorie.forcedLog(Kategorie.java:388)
bei
org.apache.log4j.Kategorie.Fehler(Kategorie.java:302)
bei
com.bla bla bla.MessageProcessTask.run(MessageProcessTask.java:103)
bei
java.util.gleichzeitige.Vollzieher$RunnableAdapter.call(Vollzieher.java:441)
bei
java.util.gleichzeitige.FutureTask$Sync.innerRun(FutureTask/java:268)
bei
java.util.gleichzeitige.FutureTask.run(FutureTask/java:54)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
bei
java.lang.Thread.run(Thread.java:619)"pool-2-thread-78" Id=148 THREAD auf
java.io.FileOutputStream.writeBytes(Native
Methode) an
java.io.FileOutputStream.schreiben(FileOutputStream.java:260)
bei
java.io.BufferedOutputStream.schreiben(BufferedOutputStream.java:105)
- gesperrt <0x6f314ba4> (eine java.io.BufferedOutputStream)
java.io.PrintStream.schreiben(PrintStream.java:430)
- gesperrt <0xd5d3504> (eine java.io.PrintStream)
org.apache.log4j.ConsoleAppender$SystemOutStream.schreiben(ConsoleAppender.java:173)
bei
Sonne.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
bei
Sonne.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
bei
Sonne.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)
bei
Sonne.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)
- gesperrt <0x6243a076> (eine java.io.OutputStreamWriter)
java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)
bei
org.apache.log4j.Helferinnen und Helfer.QuietWriter.flush(QuietWriter.java:57)
bei
org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:315)
bei
org.apache.log4j.WriterAppender.append(WriterAppender.java:159)
bei
org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:230)
- gesperrt <0x45dbd560> (eine org.apache.log4j.ConsoleAppender)
org.apache.log4j.Helferinnen und Helfer.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:65)
bei
org.apache.log4j.Kategorie.callAppenders(Kategorie.java:203)
- gesperrt <0x6c3ba437> (eine org.apache.log4j.spi.RootLogger)
org.apache.log4j.Kategorie.forcedLog(Kategorie.java:388)
bei
org.apache.log4j.Kategorie.Fehler(Kategorie.java:302)
bei
com.bla bla bla.MessageProcessTask.run(MessageProcessTask.java:103)
bei
java.util.gleichzeitige.Vollzieher$RunnableAdapter.call(Vollzieher.java:441)
bei
java.util.gleichzeitige.FutureTask$Sync.innerRun(FutureTask/java:268)
bei
java.util.gleichzeitige.FutureTask.run(FutureTask/java:54)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
bei
java.lang.Thread.run(Thread.java:619)
InformationsquelleAutor der Frage Paul Whelan | 2009-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie die AsyncAppender besser trennen Sie den logger vom appenders.
Unter Windows, klicken Sie in der Konsole-Fenster, das unterbricht die Konsole, z.B. die stdout-Puffer füllt sich, und als console-appender schreibt Seriell, Ihrer Anwendung hängen, bis Sie release die Konsole (drücke die enter Taste oder so).
Erwägen Sie die Verwendung AsyncAppender mit log4j - die meiste Zeit ist es eine gute Idee, das einzige problem seien - die AsynAppender Puffer nicht geleert vollständig verlassen.
InformationsquelleAutor der Antwort siddhadev
ersten, ich glaube, log4j schreibt, die auf Dateien und auf der Konsole Seriell oder sonst alle Ihre logs beschädigt werden würde. während also ein thread schreibt ein anderer thread, der schreiben will muss warten bis der andere fertig ist. auch, stdout blockieren kann, wenn was angeschlossen ist, um es am anderen Ende ist nicht entwässern.
in unix gibt es einen speziellen file-Deskriptor genannt stdout. wenn Sie Anwendungen starten, in der Konsole stdout wird an die Konsole. Sie können auch umleiten von stdout zu anderen Dateien. ex: java Bla > /dev/null. die Chancen sind Sie haben stdout auf eine Datei verweist, die füllen ist. zum Beispiel eine pipe ist eine Datei und wenn das Programm am anderen Ende ist nicht das entleeren der Leitung, dann das Programm, das schreiben in die pipe wird schließlich blockieren.
InformationsquelleAutor der Antwort