2009-03-11 4 views
11

Prima alcuni sfondi dell'applicazione. Ho un'applicazione che elabora molte attività indipendenti in parallelo tramite un pool di thread. Il pool di thread è ora sospeso.Log4j sta bloccando la mia applicazione cosa sto facendo male?

Quanto segue è uno snippet dai miei dump di thread, tutti i miei thread in pool-2 sono BLOCCATI da "pool-2-thread-78". Sembra essere bloccato cercando di scrivere sulla console che trovo estremamente strano. Qualcuno può far luce sulla situazione per me?

EDIT: dettagli della piattaforma versione java "1.6.0_07" Java (TM) SE Runtime Environment (build 1.6.0_07-b06) Java HotSpot (TM) Cliente VM (build 10.0-b23, misto modalità, condivisione)

Ubuntu Linux server dual quad core machine.

Sembra bloccarsi durante la scrittura sul printstream, ho preso in considerazione solo la rimozione dell'appender della console, tuttavia preferirei sapere perché lo sta bloccando e rimuoverlo in base a questa conoscenza. In passato, la rimozione e vedere se funziona è tornare a mordere me :)

relativa sezione dal mio log4j

log4j.rootLogger = DEBUG, STDOUT log4j.logger.com.blah = INFO , LOG log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender log4j.appender.LOG = org.apache.log4j.FileAppender

estratto discarica Discussione

"pool-2-thread-79" Id = 149 BLOCKED su [email protected] di proprietà di "pool-2-thread-78" Id = 148 a org.apache.log4j .Category.callAppenders (Category.java:201) a org.apache.log4j.Category.forcedLog (Category.java:388) a org.apache.log4j.Category.error (Category.java:302) a com.blah.MessageProcessTask.run (MessageProcessTask.java:103) a java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:441) a java.util.concurrent.FutureTask $ Sync. innerRun (FutureTask/java: 268) presso java.util.concurrent.FutureTask.run (FutureTask/java: 54) a java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:885) a java.util.concurrent.ThreadPoolExecutor $ Worker .run (ThreadPoolExecutor.java:907) a java.lang.Thread.run (Thread.java:619)

"pool-2-thread-78" Id = 148 RUNNABLE a java.io.FileOutputStream .writeBytes (Native Method) a java.io.FileOutputStream.write (FileOutputStream.java:260) a java.io.BufferedOutputStream.write (BufferedOutputStream.java:105) - bloccato < 0x6f314ba4> (un java.io.BufferedOutputStream) a java.io.PrintStream.write (PrintStream.java:430) - bloccato < 0xd5d3504> (un java.io.PrintStream) a org.apache. log4j.ConsoleAppender $ SystemOutStream.write (ConsoleAppender.java:173) a sun.nio.cs.StreamEncoder.writeBytes (StreamEncoder.java:202) a sun.nio.cs.StreamEncoder.implFlushBuffer (StreamEncoder.java:272) a sole .nio.cs.StreamEncoder.implFlush (StreamEncoder.java:276) a sun.nio.cs.StreamEncoder.flush (StreamEncoder.java:122) - bloccato < 0x6243a076> (un java.io.OutputStreamWriter) a java.io.OutputStreamWriter.flush (OutputStreamWriter.java:212) a org.apache.log4j.helpers.QuietWriter.flush (QuietWriter.java:57) a org.apache.log4j.WriterAppender.subAppend (WriterA ppender.java:315) a org.apache.log4j.WriterAppender.append (WriterAppender.java:159) a org.apache.log4j.AppenderSkeleton.doAppend (AppenderSkeleton.java:230) - bloccato < 0x45dbd560> (a org.apache.log4j.ConsoleAppender) a org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders (AppenderAttachableImpl.java:65) a org.apache.log4j.Category.callAppenders (Category.java:203) - bloccato < 0x6c3ba437> (un org.apache.log4j.spi.RootLogger) a org.apache.log4j.Category.forcedLog (Category.java:388) a org.apache.log4j.Category.error (Categoria. java: 302) a com.blah.MessageProcessTask.run (MessageProcessTask.java:103) a java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:441) a java.util.concurrent.FutureTask $ Sync .innerRun (FutureTask/java: 268) a java.util.concurrent.FutureTask.run (FutureTask/java: 54) a java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:885) a java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:907) a java.lang.Thread.run (Thread.java:619)

+0

Puoi pubblicare ulteriori informazioni sul tuo ambiente?Ho visto questo accadere sotto Windows quando si esegue in una shell cmd mentre si tenta di guardare la registrazione. – carson

+0

grazie carson Ho aggiunto più dettagli alla domanda –

+0

+1 per "... rimuoverlo in base a questa conoscenza ..." –

risposta

10

È possibile utilizzare AsyncAppender per scollegare meglio il registratore dagli appendici.

Su Windows, se si fa clic nella finestra della console, ciò interromperà la console, ad es. il buffer stdout si riempirà e man mano che l'appender della console scrive in serie, l'applicazione si bloccherà fino a quando non si rilascia la console (premere invio o così).

Considerare l'utilizzo di AsyncAppender con log4j - la maggior parte delle volte è una buona idea - l'unico problema è che il buffer AsynAppender non è completamente svuotato all'uscita.

+0

Grazie siddhadev ho usato il mio AsyncAppender e ho smesso di usare le cose appender della console che ora funzionano meglio. –

9

in primo luogo, credo che log4j scrive su file e sulla console in serie, altrimenti tutti i registri sarebbero corrotti. così mentre un thread sta scrivendo un altro thread che vuole scrivere deve aspettare fino a quando l'altro è finito. inoltre, lo stdout può bloccare se qualsiasi cosa vi è collegata dall'altra parte non lo esaurisce.

in unix esiste un descrittore di file speciale chiamato stdout. quando avvii le applicazioni nella console, lo stdout verrà allegato alla console. puoi anche reindirizzare lo stdout in altri file. ex: java Blah>/dev/null. è probabile che hai stdout che punta a un file che si sta riempiendo. per esempio un pipe è un file e se il programma all'altra estremità non sta svuotando la pipe, il programma che sta scrivendo alla pipe alla fine si bloccherà.

+0

Sei corretto, tuttavia, non riesco a capire perché l'appender della console è sospeso come è. Grazie –

+0

Stai registrando troppo. Prova a ridurre il livello di log per alcune cose che non ti interessano. –

+1

come hai allegato lo stdout? punta a un file? a una console? succede ancora se lo punti a/dev/null? –