Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 7EEF4200CCC for ; Fri, 21 Jul 2017 12:02:40 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 7D9F516C46E; Fri, 21 Jul 2017 10:02:40 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 9DE6416C46C for ; Fri, 21 Jul 2017 12:02:39 +0200 (CEST) Received: (qmail 38993 invoked by uid 500); 21 Jul 2017 10:02:38 -0000 Mailing-List: contact commits-help@karaf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@karaf.apache.org Delivered-To: mailing list commits@karaf.apache.org Received: (qmail 38983 invoked by uid 99); 21 Jul 2017 10:02:38 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 21 Jul 2017 10:02:38 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id AF6ECDFD82; Fri, 21 Jul 2017 10:02:38 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: cschneider@apache.org To: commits@karaf.apache.org Message-Id: <8a59273985d7439ba96e5c8687096aa8@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: karaf git commit: [KARAF-5267] Redesigned log:tail to not start threads Date: Fri, 21 Jul 2017 10:02:38 +0000 (UTC) archived-at: Fri, 21 Jul 2017 10:02:40 -0000 Repository: karaf Updated Branches: refs/heads/KARAF-3429 [created] f1ce8fa40 [KARAF-5267] Redesigned log:tail to not start threads Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/f1ce8fa4 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/f1ce8fa4 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/f1ce8fa4 Branch: refs/heads/KARAF-3429 Commit: f1ce8fa4087d834e67527a4ea05ff68a2fdfc7da Parents: f35f5b5 Author: Christian Schneider Authored: Fri Jul 21 12:02:16 2017 +0200 Committer: Christian Schneider Committed: Fri Jul 21 12:02:16 2017 +0200 ---------------------------------------------------------------------- .../apache/karaf/log/command/DisplayLog.java | 14 ++- .../org/apache/karaf/log/command/LogTail.java | 117 ++++++------------- 2 files changed, 42 insertions(+), 89 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/f1ce8fa4/log/src/main/java/org/apache/karaf/log/command/DisplayLog.java ---------------------------------------------------------------------- diff --git a/log/src/main/java/org/apache/karaf/log/command/DisplayLog.java b/log/src/main/java/org/apache/karaf/log/command/DisplayLog.java index 0d73c1d..82aec16 100644 --- a/log/src/main/java/org/apache/karaf/log/command/DisplayLog.java +++ b/log/src/main/java/org/apache/karaf/log/command/DisplayLog.java @@ -66,18 +66,20 @@ public class DisplayLog implements Action { @Override public Object execute() throws Exception { - - int minLevel = getMinLevel(level); - - final PrintStream out = System.out; + int minLevel = getMinLevel(level); + display(out, minLevel); + out.println(); + return null; + } + protected void display(final PrintStream out, int minLevel) { + Iterable le = logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries); for (PaxLoggingEvent event : le) { printEvent(out, event, minLevel); } - out.println(); - return null; + out.flush(); } protected static int getMinLevel(String levelSt) { http://git-wip-us.apache.org/repos/asf/karaf/blob/f1ce8fa4/log/src/main/java/org/apache/karaf/log/command/LogTail.java ---------------------------------------------------------------------- diff --git a/log/src/main/java/org/apache/karaf/log/command/LogTail.java b/log/src/main/java/org/apache/karaf/log/command/LogTail.java index dc48e00..8cd70f8 100644 --- a/log/src/main/java/org/apache/karaf/log/command/LogTail.java +++ b/log/src/main/java/org/apache/karaf/log/command/LogTail.java @@ -16,12 +16,7 @@ */ package org.apache.karaf.log.command; -import java.io.IOException; import java.io.PrintStream; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; import org.apache.karaf.log.core.LogService; import org.apache.karaf.shell.api.action.Command; @@ -29,7 +24,9 @@ import org.apache.karaf.shell.api.action.lifecycle.Reference; import org.apache.karaf.shell.api.action.lifecycle.Service; import org.apache.karaf.shell.api.console.Session; import org.ops4j.pax.logging.spi.PaxAppender; -import org.ops4j.pax.logging.spi.PaxLoggingEvent; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; @Command(scope = "log", name = "tail", description = "Continuously display log entries. Use ctrl-c to quit this command") @Service @@ -39,92 +36,46 @@ public class LogTail extends DisplayLog { Session session; @Reference - LogService logService; - - private ExecutorService executorService = Executors.newFixedThreadPool(2); + BundleContext context; @Override public Object execute() throws Exception { - PrintEventThread printThread = new PrintEventThread(); - ReadKeyBoardThread readKeyboardThread = new ReadKeyBoardThread(Thread.currentThread()); - executorService.execute(printThread); - executorService.execute(readKeyboardThread); - while (!Thread.currentThread().isInterrupted()) { - try { - Thread.sleep(200); - } catch (java.lang.InterruptedException e) { - break; - } - } - printThread.abort(); - readKeyboardThread.abort(); - executorService.shutdownNow(); - return null; - } - - class ReadKeyBoardThread implements Runnable { - private Thread sessionThread; - boolean readKeyboard = true; - public ReadKeyBoardThread(Thread thread) { - this.sessionThread = thread; - } - - public void abort() { - readKeyboard = false; - } - - public void run() { - while (readKeyboard) { - try { - int c = session.getKeyboard().read(); - if (c < 0) { - sessionThread.interrupt(); - break; - } - } catch (IOException e) { - break; - } - + int minLevel = getMinLevel(level); + PrintStream out = session.getConsole(); + display(out, minLevel); + PaxAppender appender = event -> printEvent(out, event, minLevel); + ServiceTracker tracker = new ServiceTracker(context, LogService.class, null) { + + @Override + public LogService addingService(ServiceReference reference) { + LogService service = super.addingService(reference); + service.addAppender(appender); + return service; } - } - } - - class PrintEventThread implements Runnable { - - PrintStream out = System.out; - boolean doDisplay = true; - public void run() { - int minLevel = getMinLevel(level); - Iterable le = logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries); - for (PaxLoggingEvent event : le) { - printEvent(out, event, minLevel); - } - out.flush(); - // Tail - final BlockingQueue queue = new LinkedBlockingQueue<>(); - PaxAppender appender = queue::add; - try { - logService.addAppender(appender); - while (doDisplay) { - printEvent(out, queue.take(), minLevel); - if (queue.isEmpty()) { - out.flush(); - } + @Override + public void removedService(ServiceReference reference, LogService service) { + service.removeAppender(appender); + synchronized (LogTail.this) { + LogTail.this.notifyAll(); } - } catch (InterruptedException e) { - // Ignore - } finally { - logService.removeAppender(appender); + }; + }; + tracker.open(); + + try { + synchronized (this) { + wait(); } - out.println(); - - } - - public void abort() { - doDisplay = false; + out.println("Stopping tail as log.core bundle was stopped."); + } catch (InterruptedException e) { + // Ignore as it will happen if the user breaks the tail using Ctrl-C + } finally { + tracker.close(); } + out.println(); + return null; } }