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

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


The following commit(s) were added to refs/heads/camel-4.18.x by this push:
     new 6b94bd252c10 CAMEL-23084: camel-jbang - camel infra log - May log 
duplicate (#21684)
6b94bd252c10 is described below

commit 6b94bd252c1083f65322d67e264cdbace1ea1f6c
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Mar 3 06:53:42 2026 +0100

    CAMEL-23084: camel-jbang - camel infra log - May log duplicate (#21684)
---
 .../jbang-commands/camel-jbang-infra-log.adoc      |  1 +
 .../META-INF/camel-jbang-commands-metadata.json    |  2 +-
 .../dsl/jbang/core/commands/infra/InfraLog.java    | 24 +++++++++++-----------
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git 
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-infra-log.adoc 
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-infra-log.adoc
index 5ad27765daaf..efe73cbe3316 100644
--- 
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-infra-log.adoc
+++ 
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-infra-log.adoc
@@ -20,6 +20,7 @@ camel infra log [options]
 |===
 | Option | Description | Default | Type
 | `--json` | Output in JSON Format |  | boolean
+| `--lines` | The number of lines from the end of the log to use as starting 
offset | 50 | int
 | `-h,--help` | Display the help and sub-commands |  | boolean
 |===
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
 
b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
index 8decb9d66af9..581921c6b448 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
@@ -15,7 +15,7 @@
     { "name": "get", "fullName": "get", "description": "Get status of Camel 
integrations", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.process.CamelStatus", "options": [ { 
"names": "--watch", "description": "Execute periodically and showing output 
fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": 
"-h,--help", "description": "Display the help and sub-commands", "javaType": 
"boolean", "type": "boolean" } ], "subcommands": [ { "name": "bean", 
"fullName": "get  [...]
     { "name": "harden", "fullName": "harden", "description": "Suggest security 
hardening for Camel routes using AI\/LLM", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.Harden", "options": [ { "names": 
"--api-key", "description": "API key for authentication. Also reads 
OPENAI_API_KEY or LLM_API_KEY env vars", "javaType": "java.lang.String", 
"type": "string" }, { "names": "--api-type", "description": "API type: 'ollama' 
or 'openai' (OpenAI-compatible)", "defaultValue": "ollama", [...]
     { "name": "hawtio", "fullName": "hawtio", "description": "Launch Hawtio 
web console", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.process.Hawtio", "options": [ { 
"names": "--openUrl", "description": "To automatic open Hawtio web console in 
the web browser", "defaultValue": "true", "javaType": "boolean", "type": 
"boolean" }, { "names": "--port", "description": "Port number to use for Hawtio 
web console (port 8888 by default)", "defaultValue": "8888", "javaType": "int", 
"t [...]
-    { "name": "infra", "fullName": "infra", "description": "List and Run 
external services for testing and prototyping", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.infra.InfraCommand", "options": [ { 
"names": "--json", "description": "Output in JSON Format", "javaType": 
"boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display 
the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], 
"subcommands": [ { "name": "get", "fullName": "infra  [...]
+    { "name": "infra", "fullName": "infra", "description": "List and Run 
external services for testing and prototyping", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.infra.InfraCommand", "options": [ { 
"names": "--json", "description": "Output in JSON Format", "javaType": 
"boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display 
the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], 
"subcommands": [ { "name": "get", "fullName": "infra  [...]
     { "name": "init", "fullName": "init", "description": "Creates a new Camel 
integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Init", 
"options": [ { "names": "--clean-dir,--clean-directory", "description": 
"Whether to clean directory first (deletes all files in directory)", 
"javaType": "boolean", "type": "boolean" }, { "names": "--dir,--directory", 
"description": "Directory relative path where the new Camel integration will be 
saved", "defaultValue": ".", "javaType" [...]
     { "name": "jolokia", "fullName": "jolokia", "description": "Attach Jolokia 
JVM Agent to a running Camel integration", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.process.Jolokia", "options": [ { 
"names": "--port", "description": "To use a specific port number when attaching 
Jolokia JVM Agent (default a free port is found in range 8778-9999)", 
"javaType": "int", "type": "integer" }, { "names": "--stop", "description": 
"Stops the Jolokia JVM Agent in the running Camel inte [...]
     { "name": "log", "fullName": "log", "description": "Tail logs from running 
Camel integrations", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.action.CamelLogAction", "options": [ 
{ "names": "--find", "description": "Find and highlight matching text (ignore 
case).", "javaType": "java.lang.String", "type": "string" }, { "names": 
"--follow", "description": "Keep following and outputting new log lines (press 
enter to exit).", "defaultValue": "true", "javaType": "boolean", "typ [...]
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraLog.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraLog.java
index 050566dba05e..cbf9f0492243 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraLog.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraLog.java
@@ -41,6 +41,10 @@ public class InfraLog extends InfraBaseCommand {
     @CommandLine.Parameters(description = "Service name", arity = "0..2")
     private List<String> serviceName;
 
+    @CommandLine.Option(names = { "--lines" }, defaultValue = "50",
+                        description = "The number of lines from the end of the 
log to use as starting offset")
+    private int logLines = 50;
+
     private ExecutorService executorService;
 
     public InfraLog(CamelJBangMain main) {
@@ -109,6 +113,7 @@ public class InfraLog extends InfraBaseCommand {
     private void createTailer(File logFile, String alias, List<Future<?>> 
futures) {
         Tailer tailer = Tailer.builder()
                 .setFile(logFile)
+                .setTailFromEnd(true)
                 .setTailerListener(new StdoutTailerListener(alias))
                 .get();
 
@@ -119,7 +124,7 @@ public class InfraLog extends InfraBaseCommand {
 
     class StdoutTailerListener implements TailerListener {
 
-        private String suffix;
+        private final String suffix;
         private Tailer self;
 
         public StdoutTailerListener(String suffix) {
@@ -149,23 +154,18 @@ public class InfraLog extends InfraBaseCommand {
         @Override
         public void init(Tailer tailer) {
             this.self = tailer;
-            try (ReversedLinesFileReader fileReader = new 
ReversedLinesFileReader(tailer.getFile())) {
-                StringBuilder sb = new StringBuilder();
-                int linesToRead = 50;
-                for (int i = 0; i < linesToRead; i++) {
+            try (ReversedLinesFileReader fileReader = 
ReversedLinesFileReader.builder().setFile(tailer.getFile()).get()) {
+                List<String> lines = new ArrayList<>(logLines);
+                for (int i = 0; i < logLines; i++) {
                     String line = fileReader.readLine();
                     if (line == null) {
                         break;
                     }
-
-                    // prepend
-                    sb.insert(0, "[" + suffix + "] " + line);
+                    lines.add(0, line);
                 }
-
-                printer().println(sb.toString());
+                lines.forEach(this::handle);
             } catch (IOException e) {
-                printer().println("Error collecting logs");
-                printer().printErr(e);
+                printer().printErr("Error initializing logs", e);
             }
         }
     }

Reply via email to