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) {