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;
}
}