This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 0b64cbee68a CAMEL-18538: camel-jbang - Log command
0b64cbee68a is described below

commit 0b64cbee68a585cb6a1e443d9ff60b9c9a3c643b
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Jan 6 11:25:38 2023 +0100

    CAMEL-18538: camel-jbang - Log command
---
 .../jbang/core/commands/action/CamelLogAction.java | 119 ++++++++++++++-------
 .../src/main/resources/log4j2-export.properties    |   2 +-
 .../src/main/resources/log4j2-no-color.properties  |   2 +-
 .../src/main/resources/log4j2-pipe.properties      |   2 +-
 .../src/main/resources/log4j2.properties           |   7 +-
 5 files changed, 84 insertions(+), 48 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
index 27d5512bc33..574843b7772 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelLogAction.java
@@ -26,15 +26,19 @@ import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
+import java.util.Set;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.regex.Pattern;
 
 import org.apache.camel.catalog.impl.TimePatternConverter;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.util.StopWatch;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.json.JsonObject;
 import org.fusesource.jansi.Ansi;
@@ -86,38 +90,10 @@ public class CamelLogAction extends ActionBaseCommand {
 
     @Override
     public Integer call() throws Exception {
-        List<Row> rows = new ArrayList<>();
-
-        List<Long> pids = findPids(name);
-        ProcessHandle.allProcesses()
-                .filter(ph -> pids.contains(ph.pid()))
-                .forEach(ph -> {
-                    JsonObject root = loadStatus(ph.pid());
-                    if (root != null) {
-                        Row row = new Row();
-                        row.pid = "" + ph.pid();
-                        JsonObject context = (JsonObject) root.get("context");
-                        if (context == null) {
-                            return;
-                        }
-                        row.name = context.getString("name");
-                        if ("CamelJBang".equals(row.name)) {
-                            row.name = ProcessHelper.extractName(root, ph);
-                        }
-                        int len = row.name.length();
-                        if (len < NAME_MIN_WIDTH) {
-                            len = NAME_MIN_WIDTH;
-                        }
-                        if (len > NAME_MAX_WIDTH) {
-                            len = NAME_MAX_WIDTH;
-                        }
-                        if (len > nameMaxWidth) {
-                            nameMaxWidth = len;
-                        }
-                        rows.add(row);
-                    }
-                });
+        Map<Long, Row> rows = new LinkedHashMap<>();
 
+        // find new pids
+        updatePids(rows);
         if (!rows.isEmpty()) {
             // read existing log files (skip by tail/since)
             if (find != null) {
@@ -151,26 +127,86 @@ public class CamelLogAction extends ActionBaseCommand {
             // dump existing log lines
             tailLogFiles(rows, tail, limit);
             dumpLogFiles(rows);
+        }
 
-            if (follow) {
-                do {
+        if (follow) {
+            boolean waitMessage = true;
+            StopWatch watch = new StopWatch();
+            do {
+                if (rows.isEmpty()) {
+                    if (waitMessage) {
+                        System.out.println("Waiting for logs ...");
+                        waitMessage = false;
+                    }
+                    Thread.sleep(250);
+                    updatePids(rows);
+                } else {
+                    waitMessage = true;
+                    if (watch.taken() > 1000) {
+                        // check for new logs
+                        updatePids(rows);
+                        watch.restart();
+                    }
                     int lines = readLogFiles(rows);
                     if (lines > 0) {
                         dumpLogFiles(rows);
                     } else {
                         Thread.sleep(50);
                     }
-                } while (true);
-            }
+                }
+            } while (true);
         }
 
         return 0;
     }
 
-    private int readLogFiles(List<Row> rows) throws Exception {
+    private void updatePids(Map<Long, Row> rows) {
+        List<Long> pids = findPids(name);
+        ProcessHandle.allProcesses()
+                .filter(ph -> pids.contains(ph.pid()))
+                .forEach(ph -> {
+                    JsonObject root = loadStatus(ph.pid());
+                    if (root != null) {
+                        Row row = new Row();
+                        row.pid = "" + ph.pid();
+                        JsonObject context = (JsonObject) root.get("context");
+                        if (context == null) {
+                            return;
+                        }
+                        row.name = context.getString("name");
+                        if ("CamelJBang".equals(row.name)) {
+                            row.name = ProcessHelper.extractName(root, ph);
+                        }
+                        int len = row.name.length();
+                        if (len < NAME_MIN_WIDTH) {
+                            len = NAME_MIN_WIDTH;
+                        }
+                        if (len > NAME_MAX_WIDTH) {
+                            len = NAME_MAX_WIDTH;
+                        }
+                        if (len > nameMaxWidth) {
+                            nameMaxWidth = len;
+                        }
+                        rows.put(ph.pid(), row);
+                    }
+                });
+
+        // remove pids that are no long active from the rows
+        Set<Long> remove = new HashSet<>();
+        for (long pid : rows.keySet()) {
+            if (!pids.contains(pid)) {
+                remove.add(pid);
+            }
+        }
+        for (long pid : remove) {
+            rows.remove(pid);
+        }
+    }
+
+    private int readLogFiles(Map<Long, Row> rows) throws Exception {
         int lines = 0;
 
-        for (Row row : rows) {
+        for (Row row : rows.values()) {
             if (row.reader == null) {
                 File log = logFile(row.pid);
                 if (log.exists()) {
@@ -203,9 +239,9 @@ public class CamelLogAction extends ActionBaseCommand {
         return lines;
     }
 
-    private void dumpLogFiles(List<Row> rows) {
+    private void dumpLogFiles(Map<Long, Row> rows) {
         List<String> lines = new ArrayList<>();
-        for (Row row : rows) {
+        for (Row row : rows.values()) {
             Queue<String> queue = row.fifo;
             if (queue != null) {
                 for (String l : queue) {
@@ -283,8 +319,8 @@ public class CamelLogAction extends ActionBaseCommand {
         return new File(dir, name);
     }
 
-    private void tailLogFiles(List<Row> rows, int tail, Date limit) throws 
Exception {
-        for (Row row : rows) {
+    private void tailLogFiles(Map<Long, Row> rows, int tail, Date limit) 
throws Exception {
+        for (Row row : rows.values()) {
             File log = logFile(row.pid);
             if (log.exists()) {
                 row.reader = new LineNumberReader(new FileReader(log));
@@ -375,6 +411,7 @@ public class CamelLogAction extends ActionBaseCommand {
         String name;
         Queue<String> fifo;
         LineNumberReader reader;
+
     }
 
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties
index c09e2c668a4..730ef1eb162 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-export.properties
@@ -23,7 +23,7 @@ appender.file.append = false
 
 appender.file.layout.type = PatternLayout
 # logging style that is similar to spring boot (no color)
-appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-40.40c : %m%n
+appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-35.35c : %m%n
 
 rootLogger.level = INFO
 rootLogger.appenderRef.out.ref = file
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-no-color.properties
 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-no-color.properties
index 2bb0c0ddc93..6dcdec667d3 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-no-color.properties
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-no-color.properties
@@ -20,7 +20,7 @@ appender.stdout.name = out
 appender.stdout.layout.type = PatternLayout
 
 # logging style that is similar to spring boot (no color)
-appender.stdout.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-40.40c : %m%n
+appender.stdout.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-35.35c : %m%n
 
 rootLogger.level = INFO
 rootLogger.appenderRef.out.ref = out
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-pipe.properties 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-pipe.properties
index f6ed178ad0d..1349f98ad8d 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-pipe.properties
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2-pipe.properties
@@ -23,7 +23,7 @@ appender.file.append = false
 
 appender.file.layout.type = PatternLayout
 # logging style that is similar to spring boot (no color)
-appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-40.40c : %m%n
+appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-35.35c : %m%n
 
 rootLogger.level = INFO
 rootLogger.appenderRef.out.ref = file
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2.properties 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2.properties
index 6da5d257de8..5561cfee4a4 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2.properties
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/log4j2.properties
@@ -20,7 +20,7 @@ appender.stdout.type = Console
 appender.stdout.name = out
 appender.stdout.layout.type = PatternLayout
 # logging style that is similar to spring boot
-appender.stdout.layout.pattern = %style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{Dim} 
%highlight{%5p} %style{%pid}{Magenta} %style{---}{Dim} %style{[%15.15t]}{Dim} 
%style{%-40.40c}{Cyan} : %m%n
+appender.stdout.layout.pattern = %style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{Dim} 
%highlight{%5p} %style{%pid}{Magenta} %style{---}{Dim} %style{[%15.15t]}{Dim} 
%style{%-35.35c}{Cyan} : %m%n
 
 # file logger
 appender.file.type = File
@@ -29,9 +29,8 @@ appender.file.fileName = 
${sys:user.home}/.camel/${sys:pid}.log
 appender.file.createOnDemand = true
 appender.file.append = false
 appender.file.layout.type = PatternLayout
-# logging style that is similar to spring boot (no color)
-#appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %pid --- 
[%15.15t] %-40.40c : %m%n
-appender.file.layout.pattern = %style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{Dim} 
%highlight{%5p} %style{%pid}{Magenta} %style{---}{Dim} %style{[%15.15t]}{Dim} 
%style{%-40.40c}{Cyan} : %m%n
+# logging style that is similar to spring boot
+appender.file.layout.pattern = %style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{Dim} 
%highlight{%5p} %style{%pid}{Magenta} %style{---}{Dim} %style{[%15.15t]}{Dim} 
%style{%-35.35c}{Cyan} : %m%n
 
 # log to console and file
 rootLogger = INFO,out,file

Reply via email to