You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by ff...@apache.org on 2013/07/25 11:07:48 UTC

svn commit: r1506853 - /karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java

Author: ffang
Date: Thu Jul 25 09:07:48 2013
New Revision: 1506853

URL: http://svn.apache.org/r1506853
Log:
[KARAF-1593]Pressing ctrl+d during log:tail make everything hang

Modified:
    karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java

Modified: karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java
URL: http://svn.apache.org/viewvc/karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java?rev=1506853&r1=1506852&r2=1506853&view=diff
==============================================================================
--- karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java (original)
+++ karaf/trunk/log/command/src/main/java/org/apache/karaf/log/command/LogTail.java Thu Jul 25 09:07:48 2013
@@ -19,41 +19,64 @@ package org.apache.karaf.log.command;
 import java.io.PrintStream;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.karaf.shell.commands.Command;
 import org.ops4j.pax.logging.spi.PaxAppender;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
-@Command(scope = "log", name = "tail", description = "Continuously display log entries.")
+@Command(scope = "log", name = "tail", description = "Continuously display log entries. Use ctrl-c to quit this command")
 public class LogTail extends DisplayLog {
 	
+    private boolean needEndLog;
+    
     protected Object doExecute() throws Exception {
-        final PrintStream out = System.out;
+        new Thread(new PrintEventThread()).start();
+       
+        for (;;) {
+            int c = session.getKeyboard().read();
+            if (c < 0) {
+                needEndLog = true;
+                break;
+            }
 
-        Iterable<PaxLoggingEvent> le = this.logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries);
-        for (PaxLoggingEvent event : le) {
-            printEvent(out, event);
         }
-        // Tail
-        final BlockingQueue<PaxLoggingEvent> queue = new LinkedBlockingQueue<PaxLoggingEvent>();
-        PaxAppender appender = new PaxAppender() {
-            public void doAppend(PaxLoggingEvent event) {
-                    queue.add(event);
+            
+        return null;
+    }
+    
+    
+    class PrintEventThread implements Runnable {
+        PrintStream out = System.out;
+        public void run() {
+            Iterable<PaxLoggingEvent> le = logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries);
+            for (PaxLoggingEvent event : le) {
+                printEvent(out, event);
             }
-        };
-        try {
-            logService.addAppender(appender);
-            for (;;) {
-            	PaxLoggingEvent event = queue.take();
-            	printEvent(out, event);
+            // Tail
+            final BlockingQueue<PaxLoggingEvent> queue = new LinkedBlockingQueue<PaxLoggingEvent>();
+            PaxAppender appender = new PaxAppender() {
+                public void doAppend(PaxLoggingEvent event) {
+                        queue.add(event);
+                }
+            };
+            try {
+                logService.addAppender(appender);
+                
+                while (!needEndLog) {
+                    PaxLoggingEvent event = queue.take();
+                    if (event != null) {
+                        printEvent(out, event);
+                    }
+                }
+            } catch (InterruptedException e) {
+                // Ignore
+            } finally {
+                logService.removeAppender(appender);
             }
-        } catch (InterruptedException e) {
-            // Ignore
-        } finally {
-            logService.removeAppender(appender);
+            out.println();
+            
         }
-        out.println();
-        return null;
     }
 
 }