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">