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);
}
}
}