You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2010/12/20 17:53:40 UTC

svn commit: r1051204 - in /karaf/trunk/shell/log/src/main: java/org/apache/karaf/shell/log/DisplayLog.java java/org/apache/karaf/shell/log/LogTail.java java/org/apache/karaf/shell/log/LruList.java resources/OSGI-INF/blueprint/shell-log.xml

Author: gnodet
Date: Mon Dec 20 16:53:40 2010
New Revision: 1051204

URL: http://svn.apache.org/viewvc?rev=1051204&view=rev
Log:
[KARAF-332] Add a log:tail command

Added:
    karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
Modified:
    karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java
    karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
    karaf/trunk/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml

Modified: karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java?rev=1051204&r1=1051203&r2=1051204&view=diff
==============================================================================
--- karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java (original)
+++ karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java Mon Dec 20 16:53:40 2010
@@ -16,11 +16,14 @@
  */
 package org.apache.karaf.shell.log;
 
+import java.io.PrintStream;
+
 import org.apache.karaf.shell.log.layout.PatternConverter;
 import org.apache.karaf.shell.log.layout.PatternParser;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.apache.felix.gogo.commands.Option;
 import org.apache.felix.gogo.commands.Command;
+import org.ops4j.pax.logging.spi.PaxAppender;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 /**
@@ -123,40 +126,44 @@ public class DisplayLog extends OsgiComm
     }
 
     protected Object doExecute() throws Exception {
-        PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        final PrintStream out = System.out;
 
         Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
-        StringBuffer sb = new StringBuffer();
         for (PaxLoggingEvent event : le) {
-            String color = getColor(event);
-            sb.setLength(0);
-            if (color != null) {
-                sb.append(FIRST_ESC_CHAR);
-                sb.append(SECOND_ESC_CHAR);
-                sb.append(color);
-                sb.append(COMMAND_CHAR);
-            }
-            for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
-                pc.format(sb, event);
-            }
-            if (event.getThrowableStrRep() != null) {
-                for (String r : event.getThrowableStrRep()) {
-                    sb.append(r).append('\n');
-                }
-            }
-            if (color != null) {
-                sb.append(FIRST_ESC_CHAR);
-                sb.append(SECOND_ESC_CHAR);
-                sb.append("0");
-                sb.append(COMMAND_CHAR);
-            }
-            System.out.print(sb.toString());
+            display(cnv, event, out);
         }
-        System.out.println();
-        
+        out.println();
         return null;
     }
 
+    protected void display(PatternConverter cnv, PaxLoggingEvent event, PrintStream stream) {
+        String color = getColor(event);
+        StringBuffer sb = new StringBuffer();
+        sb.setLength(0);
+        if (color != null) {
+            sb.append(FIRST_ESC_CHAR);
+            sb.append(SECOND_ESC_CHAR);
+            sb.append(color);
+            sb.append(COMMAND_CHAR);
+        }
+        for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
+            pc.format(sb, event);
+        }
+        if (event.getThrowableStrRep() != null) {
+            for (String r : event.getThrowableStrRep()) {
+                sb.append(r).append('\n');
+            }
+        }
+        if (color != null) {
+            sb.append(FIRST_ESC_CHAR);
+            sb.append(SECOND_ESC_CHAR);
+            sb.append("0");
+            sb.append(COMMAND_CHAR);
+        }
+        stream.print(sb.toString());
+    }
+
     private String getColor(PaxLoggingEvent event) {
         String color = null;
         if (!noColor) {

Added: karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java?rev=1051204&view=auto
==============================================================================
--- karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java (added)
+++ karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java Mon Dec 20 16:53:40 2010
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.log;
+
+import java.io.PrintStream;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.log.layout.PatternConverter;
+import org.apache.karaf.shell.log.layout.PatternParser;
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+@Command(scope = "log", name = "tail", description = "Continuously display log entries.")
+public class LogTail extends DisplayLog {
+
+    protected Object doExecute() throws Exception {
+        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        final PrintStream out = System.out;
+
+        Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
+        for (PaxLoggingEvent event : le) {
+            display(cnv, event, out);
+        }
+        // Tail
+        final BlockingQueue<PaxLoggingEvent> queue = new LinkedBlockingQueue<PaxLoggingEvent>();
+        PaxAppender appender = new PaxAppender() {
+            public void doAppend(PaxLoggingEvent event) {
+                queue.add(event);
+            }
+        };
+        try {
+            events.addAppender(appender);
+            for (;;) {
+                display(cnv, queue.take(), out);
+            }
+        } catch (InterruptedException e) {
+            // Ignore
+        } finally {
+            events.removeAppender(appender);
+        }
+        out.println();
+        return null;
+    }
+
+}

Modified: karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java?rev=1051204&r1=1051203&r2=1051204&view=diff
==============================================================================
--- karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java (original)
+++ karaf/trunk/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java Mon Dec 20 16:53:40 2010
@@ -18,8 +18,11 @@
  */
 package org.apache.karaf.shell.log;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
+import org.ops4j.pax.logging.spi.PaxAppender;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
 
 /**
@@ -32,6 +35,7 @@ public class LruList {
     private transient int end = 0;
     private transient boolean full = false;
     private final int maxElements;
+    private final List<PaxAppender> appenders;
 
     public LruList(int size) {
         if (size <= 0) {
@@ -39,71 +43,77 @@ public class LruList {
         }
         elements = new PaxLoggingEvent[size];
         maxElements = elements.length;
+        appenders = new ArrayList<PaxAppender>();
     }
 
-    public int size() {
-        synchronized (elements) {
-            int size = 0;
-            if (end < start) {
-                size = maxElements - start + end;
-            } else if (end == start) {
-                size = (full ? maxElements : 0);
-            } else {
-                size = end - start;
-            }
-            return size;
+    public synchronized int size() {
+        int size = 0;
+        if (end < start) {
+            size = maxElements - start + end;
+        } else if (end == start) {
+            size = (full ? maxElements : 0);
+        } else {
+            size = end - start;
         }
+        return size;
     }
 
-    public void clear() {
-        synchronized (elements) {
-            start = 0;
-            end = 0;
-            elements = new PaxLoggingEvent[maxElements];
-        }
+    public synchronized void clear() {
+        start = 0;
+        end = 0;
+        elements = new PaxLoggingEvent[maxElements];
     }
 
-    public void add(PaxLoggingEvent element) {
-        synchronized (elements) {
-            if (null == element) {
-                 throw new NullPointerException("Attempted to add null object to buffer");
-            }
-            if (size() == maxElements) {
-                Object e = elements[start];
-                if (null != e) {
-                    elements[start++] = null;
-                    if (start >= maxElements) {
-                        start = 0;
-                    }
-                    full = false;
+    public synchronized void add(PaxLoggingEvent element) {
+        if (null == element) {
+             throw new NullPointerException("Attempted to add null object to buffer");
+        }
+        if (size() == maxElements) {
+            Object e = elements[start];
+            if (null != e) {
+                elements[start++] = null;
+                if (start >= maxElements) {
+                    start = 0;
                 }
+                full = false;
             }
-            elements[end++] = element;
-            if (end >= maxElements) {
-                end = 0;
-            }
-            if (end == start) {
-                full = true;
+        }
+        elements[end++] = element;
+        if (end >= maxElements) {
+            end = 0;
+        }
+        if (end == start) {
+            full = true;
+        }
+        for (PaxAppender appender : appenders) {
+            try {
+                appender.doAppend(element);
+            } catch (Throwable t) {
+                // Ignore
             }
         }
     }
 
-    public Iterable<PaxLoggingEvent> getElements() {
-        synchronized (elements) {
-            return getElements(size());
-        }
+    public synchronized Iterable<PaxLoggingEvent> getElements() {
+        return getElements(size());
     }
 
-    public Iterable<PaxLoggingEvent> getElements(int nb) {
-        synchronized (elements) {
-            int s = size();
-            nb = Math.min(Math.max(0, nb), s);
-            PaxLoggingEvent[] e = new PaxLoggingEvent[nb];
-            for (int i = 0; i < nb; i++) {
-                e[i] = elements[(i + s - nb + start) % maxElements];
-            }
-            return Arrays.asList(e);
+    public synchronized Iterable<PaxLoggingEvent> getElements(int nb) {
+        int s = size();
+        nb = Math.min(Math.max(0, nb), s);
+        PaxLoggingEvent[] e = new PaxLoggingEvent[nb];
+        for (int i = 0; i < nb; i++) {
+            e[i] = elements[(i + s - nb + start) % maxElements];
         }
+        return Arrays.asList(e);
+    }
+
+    public synchronized void addAppender(PaxAppender appender) {
+        this.appenders.add(appender);
+    }
+
+    public synchronized void removeAppender(PaxAppender appender) {
+        this.appenders.remove(appender);
     }
 
 }

Modified: karaf/trunk/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml?rev=1051204&r1=1051203&r2=1051204&view=diff
==============================================================================
--- karaf/trunk/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml (original)
+++ karaf/trunk/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml Mon Dec 20 16:53:40 2010
@@ -68,6 +68,18 @@
             	<null/>
             </completers>
         </command>
+        <command name="log/tail">
+            <action class="org.apache.karaf.shell.log.LogTail">
+                <property name="events" ref="events"/>
+                <property name="pattern" value="${pattern}"/>
+                <property name="fatalColor" value="${fatalColor}"/>
+                <property name="errorColor" value="${errorColor}"/>
+                <property name="warnColor" value="${warnColor}"/>
+                <property name="infoColor" value="${infoColor}"/>
+                <property name="debugColor" value="${debugColor}"/>
+                <property name="traceColor" value="${traceColor}"/>
+            </action>
+        </command>
     </command-bundle>
 
     <bean id="vmLogAppender" class="org.apache.karaf.shell.log.VmLogAppender">