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 f95a0f68cbb CAMEL-18538: camel-jbang - Log command f95a0f68cbb is described below commit f95a0f68cbb924136ecf97ee99485df8f0d21c7b Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Jan 5 19:38:00 2023 +0100 CAMEL-18538: camel-jbang - Log command --- .../jbang/core/commands/action/CamelLogAction.java | 96 ++++++++++++++++------ 1 file changed, 70 insertions(+), 26 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 b1647906a88..3f26722aeb7 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 @@ -20,14 +20,18 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; +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.StringHelper; @@ -52,6 +56,10 @@ public class CamelLogAction extends ActionBaseCommand { description = "The number of lines from the end of the logs to show. Defaults to showing all logs.") int tail; + @CommandLine.Option(names = { "--since" }, + description = "Return logs newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.") + String since; + private int nameMaxWidth; private final Map<String, Ansi.Color> colors = new HashMap<>(); @@ -92,8 +100,19 @@ public class CamelLogAction extends ActionBaseCommand { }); if (!rows.isEmpty()) { - // read existing log files - tailLogFiles(rows); + // read existing log files (skip by tail/since) + Date limit = null; + if (since != null) { + long millis; + if (StringHelper.isDigit(since)) { + // is in seconds by default + millis = TimePatternConverter.toMilliSeconds(since) * 1000; + } else { + millis = TimePatternConverter.toMilliSeconds(since); + } + limit = new Date(System.currentTimeMillis() - millis); + } + tailLogFiles(rows, tail, limit); dumpLogFiles(rows); // scan and read new log lines @@ -190,27 +209,7 @@ public class CamelLogAction extends ActionBaseCommand { } System.out.println(line); } else { - // unescape ANSI colors - StringBuilder sb = new StringBuilder(); - boolean escaping = false; - char[] arr = line.toCharArray(); - for (int i = 0; i < arr.length; i++) { - char ch = arr[i]; - if (escaping) { - if (ch == 'm') { - escaping = false; - } - continue; - } - char ch2 = i < arr.length - 1 ? arr[i + 1] : 0; - if (ch == 27 && ch2 == '[') { - escaping = true; - continue; - } - - sb.append(ch); - } - line = sb.toString(); + line = unescapeAnsi(line); if (name != null) { String n = String.format("%-" + nameMaxWidth + "s", name); System.out.print(n); @@ -226,7 +225,7 @@ public class CamelLogAction extends ActionBaseCommand { return new File(dir, name); } - private void tailLogFiles(List<Row> rows) throws Exception { + private void tailLogFiles(List<Row> rows, int tail, Date limit) throws Exception { for (Row row : rows) { File log = logFile(row.pid); if (log.exists()) { @@ -240,8 +239,11 @@ public class CamelLogAction extends ActionBaseCommand { do { line = row.reader.readLine(); if (line != null) { - while (!row.fifo.offer(line)) { - row.fifo.poll(); + boolean valid = isValidSince(limit, line); + if (valid) { + while (!row.fifo.offer(line)) { + row.fifo.poll(); + } } } } while (line != null); @@ -249,6 +251,48 @@ public class CamelLogAction extends ActionBaseCommand { } } + private boolean isValidSince(Date limit, String line) { + if (limit == null) { + return true; + } + // the log can be in color or not so we need to unescape always + line = unescapeAnsi(line); + String ts = StringHelper.before(line, " "); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + try { + Date row = sdf.parse(ts); + return row.compareTo(limit) >= 0; + } catch (ParseException e) { + // ignore + } + return false; + } + + private String unescapeAnsi(String line) { + // unescape ANSI colors + StringBuilder sb = new StringBuilder(); + boolean escaping = false; + char[] arr = line.toCharArray(); + for (int i = 0; i < arr.length; i++) { + char ch = arr[i]; + if (escaping) { + if (ch == 'm') { + escaping = false; + } + continue; + } + char ch2 = i < arr.length - 1 ? arr[i + 1] : 0; + if (ch == 27 && ch2 == '[') { + escaping = true; + continue; + } + + sb.append(ch); + } + return sb.toString(); + } + private static class Row { String pid; String name;