You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2017/07/31 07:59:20 UTC
[1/6] karaf git commit: [KARAF-5267] Redesigned log:tail to not start
threads
Repository: karaf
Updated Branches:
refs/heads/karaf-4.1.x 380929f83 -> 5e2f07e44
[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/5c0800e4
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/5c0800e4
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/5c0800e4
Branch: refs/heads/karaf-4.1.x
Commit: 5c0800e4b7717f2a476ecb3552eaa41f6b3c7fed
Parents: 380929f
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Fri Jul 21 12:02:16 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Mon Jul 31 09:25:45 2017 +0200
----------------------------------------------------------------------
.../apache/karaf/log/command/DisplayLog.java | 14 ++-
.../org/apache/karaf/log/command/LogTail.java | 119 +++++--------------
2 files changed, 41 insertions(+), 92 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/5c0800e4/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<PaxLoggingEvent> 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/5c0800e4/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 516a3c3..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,96 +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<LogService, LogService> tracker = new ServiceTracker<LogService, LogService>(context, LogService.class, null) {
+
+ @Override
+ public LogService addingService(ServiceReference<LogService> 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<PaxLoggingEvent> le = logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries);
- for (PaxLoggingEvent event : le) {
- printEvent(out, event, minLevel);
- }
- out.flush();
- // Tail
- final BlockingQueue<PaxLoggingEvent> queue = new LinkedBlockingQueue<PaxLoggingEvent>();
- PaxAppender appender = new PaxAppender() {
- public void doAppend(PaxLoggingEvent event) {
- queue.add(event);
+ @Override
+ public void removedService(ServiceReference<LogService> reference, LogService service) {
+ service.removeAppender(appender);
+ synchronized (LogTail.this) {
+ LogTail.this.notifyAll();
}
};
- try {
- logService.addAppender(appender);
- while (doDisplay) {
- printEvent(out, queue.take(), minLevel);
- if (queue.isEmpty()) {
- out.flush();
- }
- }
- } 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;
}
}
[6/6] karaf git commit: [KARAF-5266] Limit log entries displayed on
tail to 50 by default
Posted by cs...@apache.org.
[KARAF-5266] Limit log entries displayed on tail to 50 by default
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/5e2f07e4
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/5e2f07e4
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/5e2f07e4
Branch: refs/heads/karaf-4.1.x
Commit: 5e2f07e442939e667a2653cc10ce3d6834899360
Parents: 29780f2
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Sun Jul 30 16:49:16 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Mon Jul 31 09:26:52 2017 +0200
----------------------------------------------------------------------
log/src/main/java/org/apache/karaf/log/command/LogTail.java | 3 +++
1 file changed, 3 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/5e2f07e4/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 d43b639..dc67e26 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
@@ -40,6 +40,9 @@ public class LogTail extends DisplayLog {
@Override
public Object execute() throws Exception {
+ if (entries == 0) {
+ entries = 50;
+ }
int minLevel = getMinLevel(level);
// Do not use System.out as it may write to the wrong console depending on the thread that calls our log handler
PrintStream out = session.getConsole();
[2/6] karaf git commit: Remove some duplication in
LogEventFormatterImpl
Posted by cs...@apache.org.
Remove some duplication in LogEventFormatterImpl
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/2482d225
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/2482d225
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/2482d225
Branch: refs/heads/karaf-4.1.x
Commit: 2482d2259a6807fdefc78b33bc24e181cba5330d
Parents: fd4f640
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Fri Jul 21 16:21:07 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Mon Jul 31 09:25:48 2017 +0200
----------------------------------------------------------------------
.../core/internal/LogEventFormatterImpl.java | 123 ++++---------------
.../karaf/log/core/internal/osgi/Activator.java | 13 +-
2 files changed, 30 insertions(+), 106 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/2482d225/log/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java b/log/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java
index 0ba1f3e..5709b6b 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/LogEventFormatterImpl.java
@@ -16,6 +16,9 @@
*/
package org.apache.karaf.log.core.internal;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.karaf.log.core.LogEventFormatter;
import org.apache.karaf.log.core.internal.layout.PatternConverter;
import org.apache.karaf.log.core.internal.layout.PatternParser;
@@ -23,79 +26,19 @@ import org.ops4j.pax.logging.spi.PaxLoggingEvent;
public class LogEventFormatterImpl implements LogEventFormatter {
- protected String pattern;
- protected String fatalColor;
- protected String errorColor;
- protected String warnColor;
- protected String infoColor;
- protected String debugColor;
- protected String traceColor;
-
- private static final String FATAL = "fatal";
- private static final String ERROR = "error";
- private static final String WARN = "warn";
- private static final String INFO = "info";
- private static final String DEBUG = "debug";
- private static final String TRACE = "trace";
-
- private static final char FIRST_ESC_CHAR = 27;
- private static final char SECOND_ESC_CHAR = '[';
- private static final char COMMAND_CHAR = 'm';
-
- public String getPattern() {
- return pattern;
- }
+ private String pattern;
+ private Map<Integer, String> level2Color = new HashMap<>();
public void setPattern(String pattern) {
this.pattern = pattern;
}
- public String getFatalColor() {
- return fatalColor;
- }
-
- public void setFatalColor(String fatalColor) {
- this.fatalColor = fatalColor;
- }
-
- public String getErrorColor() {
- return errorColor;
- }
-
- public void setErrorColor(String errorColor) {
- this.errorColor = errorColor;
- }
-
- public String getWarnColor() {
- return warnColor;
- }
-
- public void setWarnColor(String warnColor) {
- this.warnColor = warnColor;
- }
-
- public String getInfoColor() {
- return infoColor;
- }
-
- public void setInfoColor(String infoColor) {
- this.infoColor = infoColor;
- }
-
- public String getDebugColor() {
- return debugColor;
- }
-
- public void setDebugColor(String debugColor) {
- this.debugColor = debugColor;
- }
-
- public String getTraceColor() {
- return traceColor;
- }
-
- public void setTraceColor(String traceColor) {
- this.traceColor = traceColor;
+ public void setColor(int level, String color) {
+ if (color != null && color.length() > 0) {
+ this.level2Color.put(level, color);
+ } else {
+ this.level2Color.remove(level);
+ }
}
/* (non-Javadoc)
@@ -106,13 +49,7 @@ public class LogEventFormatterImpl implements LogEventFormatter {
final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
String color = getColor(event, noColor);
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);
- }
+ color(sb, color);
for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
pc.format(sb, event);
}
@@ -121,37 +58,25 @@ public class LogEventFormatterImpl implements LogEventFormatter {
sb.append(r).append('\n');
}
}
+ color(sb, "0");
+ return sb.toString();
+ }
+
+ private void color(StringBuffer sb, String color) {
if (color != null) {
- sb.append(FIRST_ESC_CHAR);
- sb.append(SECOND_ESC_CHAR);
- sb.append("0");
- sb.append(COMMAND_CHAR);
+ sb.append((char)27);
+ sb.append('[');
+ sb.append(color);
+ sb.append('m');
}
- return sb.toString();
}
private String getColor(PaxLoggingEvent event, boolean noColor) {
- String color = null;
if (!noColor && event != null && event.getLevel() != null && event.getLevel().toString() != null) {
- String lvl = event.getLevel().toString().toLowerCase();
- if (FATAL.equals(lvl)) {
- color = fatalColor;
- } else if (ERROR.equals(lvl)) {
- color = errorColor;
- } else if (WARN.equals(lvl)) {
- color = warnColor;
- } else if (INFO.equals(lvl)) {
- color = infoColor;
- } else if (DEBUG.equals(lvl)) {
- color = debugColor;
- } else if (TRACE.equals(lvl)) {
- color = traceColor;
- }
- if (color != null && color.length() == 0) {
- color = null;
- }
+ return level2Color.get(event.getLevel().toInt());
+ } else {
+ return null;
}
- return color;
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/2482d225/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java b/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
index c0a6a23..d2dc0e8 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
@@ -29,6 +29,7 @@ import org.apache.karaf.util.tracker.annotation.Managed;
import org.apache.karaf.util.tracker.annotation.ProvideService;
import org.apache.karaf.util.tracker.annotation.RequireService;
import org.apache.karaf.util.tracker.annotation.Services;
+import org.ops4j.pax.logging.PaxLogger;
import org.ops4j.pax.logging.spi.PaxAppender;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ManagedService;
@@ -48,7 +49,6 @@ public class Activator extends BaseActivator implements ManagedService {
int size = getInt("size", 500);
String pattern = getString("pattern", "%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n");
- String fatalColor = getString("fatalColor", "31");
String errorColor = getString("errorColor", "31");
String warnColor = getString("warnColor", "35");
String infoColor = getString("infoColor", "36");
@@ -62,12 +62,11 @@ public class Activator extends BaseActivator implements ManagedService {
LogEventFormatterImpl formatter = new LogEventFormatterImpl();
formatter.setPattern(pattern);
- formatter.setFatalColor(fatalColor);
- formatter.setErrorColor(errorColor);
- formatter.setWarnColor(warnColor);
- formatter.setInfoColor(infoColor);
- formatter.setDebugColor(debugColor);
- formatter.setTraceColor(traceColor);
+ formatter.setColor(PaxLogger.LEVEL_ERROR, errorColor);
+ formatter.setColor(PaxLogger.LEVEL_WARNING, warnColor);
+ formatter.setColor(PaxLogger.LEVEL_INFO, infoColor);
+ formatter.setColor(PaxLogger.LEVEL_DEBUG, debugColor);
+ formatter.setColor(PaxLogger.LEVEL_TRACE, traceColor);
register(LogEventFormatter.class, formatter);
LogServiceImpl logService = new LogServiceImpl(configurationAdmin, events);
[5/6] karaf git commit: React correctly when bundle stops
Posted by cs...@apache.org.
React correctly when bundle stops
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/29780f2c
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/29780f2c
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/29780f2c
Branch: refs/heads/karaf-4.1.x
Commit: 29780f2c4bf65368aa641e335b0608082939d485
Parents: c9173c0
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Sun Jul 30 15:39:18 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Mon Jul 31 09:26:52 2017 +0200
----------------------------------------------------------------------
.../org/apache/karaf/log/command/LogTail.java | 54 ++++++++++++--------
1 file changed, 34 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/29780f2c/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 00d5a2b..d43b639 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
@@ -27,11 +27,11 @@ import org.ops4j.pax.logging.spi.PaxAppender;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
@Command(scope = "log", name = "tail", description = "Continuously display log entries. Use ctrl-c to quit this command")
@Service
public class LogTail extends DisplayLog {
-
@Reference
Session session;
@@ -45,26 +45,10 @@ public class LogTail extends DisplayLog {
PrintStream out = session.getConsole();
display(out, minLevel);
out.flush();
- PaxAppender appender = event -> printEvent(out, event, minLevel);
- ServiceTracker<LogService, LogService> tracker = new ServiceTracker<LogService, LogService>(context, LogService.class, null) {
-
- @Override
- public LogService addingService(ServiceReference<LogService> reference) {
- LogService service = super.addingService(reference);
- service.addAppender(appender);
- return service;
- }
- @Override
- public void removedService(ServiceReference<LogService> reference, LogService service) {
- service.removeAppender(appender);
- synchronized (LogTail.this) {
- LogTail.this.notifyAll();
- }
- };
- };
+ PaxAppender appender = event -> printEvent(out, event, minLevel);
+ ServiceTracker<LogService, LogService> tracker = new LogServiceTracker(context, LogService.class, null, appender);
tracker.open();
-
try {
synchronized (this) {
wait();
@@ -76,8 +60,38 @@ public class LogTail extends DisplayLog {
tracker.close();
}
out.println();
-
return null;
}
+
+ private synchronized void stopTail() {
+ notifyAll();
+ }
+
+ /**
+ * Track LogService dynamically so we can react when the log core bundle stops even while we block for the tail
+ */
+ private final class LogServiceTracker extends ServiceTracker<LogService, LogService> {
+ private final PaxAppender appender;
+
+ private LogServiceTracker(BundleContext context, Class<LogService> clazz,
+ ServiceTrackerCustomizer<LogService, LogService> customizer,
+ PaxAppender appender) {
+ super(context, clazz, customizer);
+ this.appender = appender;
+ }
+
+ @Override
+ public LogService addingService(ServiceReference<LogService> reference) {
+ LogService service = super.addingService(reference);
+ service.addAppender(appender);
+ return service;
+ }
+
+ @Override
+ public void removedService(ServiceReference<LogService> reference, LogService service) {
+ service.removeAppender(appender);
+ stopTail();
+ }
+ }
}
[4/6] karaf git commit: Extract and simplify buffer functionality
Posted by cs...@apache.org.
Extract and simplify buffer functionality
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/c9173c0e
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/c9173c0e
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/c9173c0e
Branch: refs/heads/karaf-4.1.x
Commit: c9173c0ecbf26250a027b32a2f3a63953b9a6439
Parents: 2482d22
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Sun Jul 30 15:29:11 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Mon Jul 31 09:26:50 2017 +0200
----------------------------------------------------------------------
.../karaf/log/core/internal/CircularBuffer.java | 109 +++++++++++++++++++
.../karaf/log/core/internal/KarafLogEvent.java | 1 -
.../karaf/log/core/internal/LogServiceImpl.java | 37 +++++--
.../karaf/log/core/internal/osgi/Activator.java | 11 +-
.../log/core/internal/SetLogLevelTest.java | 2 +-
5 files changed, 142 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/c9173c0e/log/src/main/java/org/apache/karaf/log/core/internal/CircularBuffer.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/CircularBuffer.java b/log/src/main/java/org/apache/karaf/log/core/internal/CircularBuffer.java
new file mode 100644
index 0000000..c953b31
--- /dev/null
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/CircularBuffer.java
@@ -0,0 +1,109 @@
+/*
+ * 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.log.core.internal;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * An array that only keeps the last N elements added
+ */
+public class CircularBuffer<T> {
+
+ private T[] elements;
+ private transient int start;
+ private transient int end;
+ private transient boolean full;
+ private final int maxElements;
+ private Class<?> type;
+
+ public CircularBuffer(int size, Class<?> type) {
+ if (size <= 0) {
+ throw new IllegalArgumentException("The size must be greater than 0");
+ }
+ this.type = type;
+ maxElements = size;
+ clear();
+ }
+
+ private int size() {
+ if (end == start) {
+ return full ? maxElements : 0;
+ } else if (end < start) {
+ return maxElements - start + end;
+ } else {
+ return end - start;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public synchronized void clear() {
+ start = 0;
+ end = 0;
+ full = false;
+ elements = (T[])Array.newInstance(type, maxElements);
+ }
+
+ public synchronized void add(T element) {
+ if (null == element) {
+ throw new NullPointerException("Attempted to add null object to buffer");
+ }
+ if (full) {
+ increaseStart();
+ }
+ elements[end] = element;
+ increaseEnd();
+
+ }
+
+ private void increaseStart() {
+ start++;
+ if (start >= maxElements) {
+ start = 0;
+ }
+ }
+
+ private void increaseEnd() {
+ end++;
+ if (end >= maxElements) {
+ end = 0;
+ }
+ if (end == start) {
+ full = true;
+ }
+ }
+
+ public synchronized Iterable<T> getElements() {
+ return getElements(size());
+ }
+
+ public synchronized Iterable<T> getElements(int nb) {
+ int s = size();
+ nb = Math.min(Math.max(0, nb), s);
+ List<T> result = new ArrayList<T>();
+ for (int i = 0; i < nb; i++) {
+ result.add(elements[(i + s - nb + start) % maxElements]);
+ }
+ return result;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/karaf/blob/c9173c0e/log/src/main/java/org/apache/karaf/log/core/internal/KarafLogEvent.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/KarafLogEvent.java b/log/src/main/java/org/apache/karaf/log/core/internal/KarafLogEvent.java
index b81b281..a7638fb 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/KarafLogEvent.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/KarafLogEvent.java
@@ -61,7 +61,6 @@ public class KarafLogEvent implements PaxLoggingEvent {
@Override
public String getLoggerName() {
- // TODO Auto-generated method stub
return this.loggerName;
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/c9173c0e/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
index c72a0b6..9c32cfc 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/LogServiceImpl.java
@@ -18,7 +18,9 @@ package org.apache.karaf.log.core.internal;
import java.io.IOException;
import java.util.Dictionary;
+import java.util.List;
import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.karaf.log.core.Level;
import org.apache.karaf.log.core.LogService;
@@ -27,16 +29,19 @@ import org.ops4j.pax.logging.spi.PaxLoggingEvent;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
-public class LogServiceImpl implements LogService {
+public class LogServiceImpl implements LogService, PaxAppender {
static final String CONFIGURATION_PID = "org.ops4j.pax.logging";
private final ConfigurationAdmin configAdmin;
- private final LruList events;
+ private final CircularBuffer<PaxLoggingEvent> buffer;
+ private List<PaxAppender> appenders;
+
- public LogServiceImpl(ConfigurationAdmin configAdmin, LruList events) {
+ public LogServiceImpl(ConfigurationAdmin configAdmin, int size) {
this.configAdmin = configAdmin;
- this.events = events;
+ this.appenders = new CopyOnWriteArrayList<>();
+ this.buffer = new CircularBuffer<>(size, PaxLoggingEvent.class);
}
private LogServiceInternal getDelegate(Dictionary<String, Object> config) {
@@ -113,17 +118,17 @@ public class LogServiceImpl implements LogService {
@Override
public Iterable<PaxLoggingEvent> getEvents() {
- return events.getElements();
+ return buffer.getElements();
}
@Override
public Iterable<PaxLoggingEvent> getEvents(int maxNum) {
- return events.getElements(maxNum);
+ return buffer.getElements(maxNum);
}
@Override
public void clearEvents() {
- events.clear();
+ buffer.clear();
}
@Override
@@ -150,12 +155,26 @@ public class LogServiceImpl implements LogService {
@Override
public void addAppender(PaxAppender appender) {
- events.addAppender(appender);
+ this.appenders.add(appender);
}
@Override
public void removeAppender(PaxAppender appender) {
- events.removeAppender(appender);
+ this.appenders.remove(appender);
+ }
+
+ @Override
+ public synchronized void doAppend(PaxLoggingEvent event) {
+ event.getProperties(); // ensure MDC properties are copied
+ KarafLogEvent eventCopy = new KarafLogEvent(event);
+ this.buffer.add(eventCopy);
+ for (PaxAppender appender : appenders) {
+ try {
+ appender.doAppend(eventCopy);
+ } catch (Throwable t) {
+ // Ignore
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/c9173c0e/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java b/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
index d2dc0e8..f47b456 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
@@ -23,7 +23,6 @@ import org.apache.karaf.log.core.LogService;
import org.apache.karaf.log.core.internal.LogEventFormatterImpl;
import org.apache.karaf.log.core.internal.LogMBeanImpl;
import org.apache.karaf.log.core.internal.LogServiceImpl;
-import org.apache.karaf.log.core.internal.LruList;
import org.apache.karaf.util.tracker.BaseActivator;
import org.apache.karaf.util.tracker.annotation.Managed;
import org.apache.karaf.util.tracker.annotation.ProvideService;
@@ -55,11 +54,6 @@ public class Activator extends BaseActivator implements ManagedService {
String debugColor = getString("debugColor", "39");
String traceColor = getString("traceColor", "39");
- LruList events = new LruList(size);
- Hashtable<String, Object> props = new Hashtable<String, Object>();
- props.put("org.ops4j.pax.logging.appender.name", "VmLogAppender");
- register(PaxAppender.class, events, props);
-
LogEventFormatterImpl formatter = new LogEventFormatterImpl();
formatter.setPattern(pattern);
formatter.setColor(PaxLogger.LEVEL_ERROR, errorColor);
@@ -69,7 +63,10 @@ public class Activator extends BaseActivator implements ManagedService {
formatter.setColor(PaxLogger.LEVEL_TRACE, traceColor);
register(LogEventFormatter.class, formatter);
- LogServiceImpl logService = new LogServiceImpl(configurationAdmin, events);
+ LogServiceImpl logService = new LogServiceImpl(configurationAdmin, size);
+ Hashtable<String, Object> props = new Hashtable<>();
+ props.put("org.ops4j.pax.logging.appender.name", "VmLogAppender");
+ register(PaxAppender.class, logService, props);
register(LogService.class, logService);
LogMBeanImpl securityMBean = new LogMBeanImpl(logService);
http://git-wip-us.apache.org/repos/asf/karaf/blob/c9173c0e/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
----------------------------------------------------------------------
diff --git a/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java b/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
index a6e4d46..957c6ff 100644
--- a/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
+++ b/log/src/test/java/org/apache/karaf/log/core/internal/SetLogLevelTest.java
@@ -52,7 +52,7 @@ public class SetLogLevelTest extends TestCase {
configuration.update(properties);
ConfigurationAdmin configAdmin = EasyMock.createMock(ConfigurationAdmin.class);
EasyMock.expect(configAdmin.getConfiguration(LogServiceImpl.CONFIGURATION_PID, null)).andReturn(configuration);
- logService = new LogServiceImpl(configAdmin, new LruList(100));
+ logService = new LogServiceImpl(configAdmin, 100);
logMBean = new LogMBeanImpl(logService);
EasyMock.replay(configAdmin);
EasyMock.replay(configuration);
[3/6] karaf git commit: [KARAF-5267] Documentation and move flush to
correct position
Posted by cs...@apache.org.
[KARAF-5267] Documentation and move flush to correct position
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/fd4f6400
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/fd4f6400
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/fd4f6400
Branch: refs/heads/karaf-4.1.x
Commit: fd4f64006a0efe2a461af225124d25ad33b22a25
Parents: 5c0800e
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Fri Jul 21 12:09:41 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Mon Jul 31 09:25:48 2017 +0200
----------------------------------------------------------------------
log/src/main/java/org/apache/karaf/log/command/DisplayLog.java | 2 --
log/src/main/java/org/apache/karaf/log/command/LogTail.java | 2 ++
2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/fd4f6400/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 82aec16..076b8ec 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
@@ -74,12 +74,10 @@ public class DisplayLog implements Action {
}
protected void display(final PrintStream out, int minLevel) {
-
Iterable<PaxLoggingEvent> le = logService.getEvents(entries == 0 ? Integer.MAX_VALUE : entries);
for (PaxLoggingEvent event : le) {
printEvent(out, event, minLevel);
}
- out.flush();
}
protected static int getMinLevel(String levelSt) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/fd4f6400/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 8cd70f8..00d5a2b 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
@@ -41,8 +41,10 @@ public class LogTail extends DisplayLog {
@Override
public Object execute() throws Exception {
int minLevel = getMinLevel(level);
+ // Do not use System.out as it may write to the wrong console depending on the thread that calls our log handler
PrintStream out = session.getConsole();
display(out, minLevel);
+ out.flush();
PaxAppender appender = event -> printEvent(out, event, minLevel);
ServiceTracker<LogService, LogService> tracker = new ServiceTracker<LogService, LogService>(context, LogService.class, null) {