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