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 <[email protected]>
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