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 9dd5ca3ca23 Jbang log (#13976)
9dd5ca3ca23 is described below
commit 9dd5ca3ca23110e5b51806cb8e7b5553968d1cf5
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Apr 29 12:50:54 2024 +0200
Jbang log (#13976)
* CAMEL-20721: camel-jbang - Make it possible to set logging-level per
package individually from CLI
* CAMEL-20721: camel-jbang - Make it possible to set logging-level per
package individually from CLI
---
.../modules/ROOT/pages/camel-jbang.adoc | 39 ++++++++++++-
.../dsl/jbang/core/commands/CamelCommand.java | 4 +-
.../dsl/jbang/core/commands/ExportBaseCommand.java | 4 +-
.../apache/camel/dsl/jbang/core/commands/Run.java | 32 ++++++++++-
.../camel/dsl/jbang/core/common/RuntimeUtil.java | 66 ++++++++++++++++++----
5 files changed, 127 insertions(+), 18 deletions(-)
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index ff04e5be63a..92b79043902 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -1631,7 +1631,7 @@ camel cmd logger
91103 foo 20s root INFO
----
-The logging level can be change at runtime, for example to change foo to DEBUG
you execute:
+The logging level can be changed at runtime, for example to change foo to
DEBUG you execute:
[source,bash]
----
@@ -1640,6 +1640,43 @@ camel cmd logger --level=DEBUG foo
TIP: You can use `--all` to change logging levels for all running integrations.
+===== Configuring individual logging levels
+
+From *Camel 4.6* onwards you can easily configure different logging levels
from CLI and `application.properties`.
+
+For example from CLI you can specify using the `--logging-category` option.
For example to enable DEBUG logging if using Kafka:
+
+[source,bash]
+----
+$ camel run myapp.yaml --logging-category=org.apache.kafka=DEBUG
+----
+
+You can specify multiple categories by repeating the CLI option as shown:
+
+[source,bash]
+----
+$ camel run myapp.yaml --logging-category=org.apache.kafka=DEBUG
--logging-category=com.foo.something=TRACE
+----
+
+You can also configure logging levels in `application.properties` using two
styles
+
+- `logging.level.` is the default style used by Camel and Spring Boot
+- `quarkus.log.category.` is used by Quarkus
+
+For example, you can declare as follows:
+
+[source,properties]
+----
+
+# make it easy to configure individual logging levels
+logging.level.org.apache.kafka = DEBUG
+logging.level.com.foo.something = TRACE
+
+# you can also use quarkus style naming
+quarkus.log.category."org.apache.kafka".level = DEBUG
+quarkus.log.category."com.foo.something".level = TRACE
+----
+
==== Listing services
Some Camel integrations may host a service which clients can call, such as
REST, or SOAP-WS, or socket-level services using TCP protocols.
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
index ddbafad01f1..40ed1be0e41 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
@@ -52,8 +52,8 @@ public abstract class CamelCommand implements
Callable<Integer> {
return main;
}
- protected void configureLoggingOff() {
- RuntimeUtil.configureLog("off", false, false, false, false, null);
+ protected void configureLoggingOff() throws Exception {
+ RuntimeUtil.configureLog("off", false, false, false, false, null,
null);
}
protected boolean disarrangeLogging() {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 24f0803d95c..a3df4f79217 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -227,9 +227,9 @@ abstract class ExportBaseCommand extends CamelCommand {
public Integer doCall() throws Exception {
// configure logging first
if (logging) {
- RuntimeUtil.configureLog(loggingLevel, false, false, false, true,
null);
+ RuntimeUtil.configureLog(loggingLevel, false, false, false, true,
null, null);
} else {
- RuntimeUtil.configureLog("off", false, false, false, true, null);
+ RuntimeUtil.configureLog("off", false, false, false, true, null,
null);
}
if (!quiet) {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 795b6ae8f5a..c27923ca164 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -215,6 +215,9 @@ public class Run extends CamelCommand {
@Option(names = { "--logging-config-path" }, description = "Path to file
with custom logging configuration")
String loggingConfigPath;
+ @Option(names = { "--logging-category" }, description = "Used for
individual logging levels (ex: org.apache.kafka=DEBUG)")
+ List<String> loggingCategory = new ArrayList<>();
+
@Option(names = { "--max-messages" }, defaultValue = "0", description =
"Max number of messages to process before stopping")
int maxMessages;
@@ -1430,11 +1433,34 @@ public class Run extends CamelCommand {
return main;
}
- private void configureLogging() {
+ private void configureLogging() throws Exception {
if (silentRun) {
// do not configure logging
} else if (logging) {
- RuntimeUtil.configureLog(loggingLevel, loggingColor, loggingJson,
scriptRun, false, loggingConfigPath);
+ // allow to configure individual logging levels in
application.properties
+ Properties prop = loadProfileProperties();
+ if (prop != null) {
+ for (Object obj : prop.keySet()) {
+ String key = obj.toString();
+ String value = prop.getProperty(key);
+ if (key.startsWith("logging.level.")) {
+ key = key.substring(14);
+ } else if (key.startsWith("quarkus.log.category.")) {
+ key = key.substring(21);
+ if (key.endsWith(".level")) {
+ key = key.substring(0, key.length() - 6);
+ }
+ }
+ key = StringHelper.removeLeadingAndEndingQuotes(key);
+ String line = key + "=" + value;
+ String line2 = key + " = " + value;
+ if (!loggingCategory.contains(line) &&
!loggingCategory.contains(line2)) {
+ loggingCategory.add(line);
+ }
+ }
+ }
+ RuntimeUtil.configureLog(loggingLevel, loggingColor, loggingJson,
scriptRun, false, loggingConfigPath,
+ loggingCategory);
writeSettings("loggingLevel", loggingLevel);
writeSettings("loggingColor", loggingColor ? "true" : "false");
writeSettings("loggingJson", loggingJson ? "true" : "false");
@@ -1445,7 +1471,7 @@ public class Run extends CamelCommand {
logFile.deleteOnExit();
}
} else {
- RuntimeUtil.configureLog("off", false, false, false, false, null);
+ RuntimeUtil.configureLog("off", false, false, false, false, null,
null);
writeSettings("loggingLevel", "off");
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java
index 41b8371a405..ca44f91652a 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java
@@ -19,15 +19,20 @@ package org.apache.camel.dsl.jbang.core.common;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.StringReader;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
+import java.util.StringJoiner;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.camel.util.IOHelper;
import org.apache.camel.util.OrderedProperties;
+import org.apache.camel.util.StringHelper;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
@@ -39,23 +44,64 @@ public final class RuntimeUtil {
}
public static void configureLog(
- String level, boolean color, boolean json, boolean script, boolean
export, String loggingConfigPath) {
+ String level, boolean color, boolean json, boolean script, boolean
export, String loggingConfigPath,
+ List<String> loggingCategories)
+ throws Exception {
if (INIT_DONE.compareAndSet(false, true)) {
long pid = ProcessHandle.current().pid();
System.setProperty("pid", Long.toString(pid));
if (loggingConfigPath != null) {
+ // ust custom logging configuration as-is
Configurator.initialize("CamelJBang", "file://" +
Path.of(loggingConfigPath).toAbsolutePath());
- } else if (export) {
- Configurator.initialize("CamelJBang",
"log4j2-export.properties");
- } else if (script) {
- Configurator.initialize("CamelJBang",
"log4j2-script.properties");
- } else if (json) {
- Configurator.initialize("CamelJBang",
"log4j2-json.properties");
- } else if (color) {
- Configurator.initialize("CamelJBang", "log4j2.properties");
+ } else if (loggingCategories != null &&
!loggingCategories.isEmpty()) {
+ // enrich logging file with custom logging categories
+ String name = "log4j2-no-color.properties";
+ if (export) {
+ name = "log4j2-export.properties";
+ } else if (script) {
+ name = "log4j2-export.properties";
+ } else if (json) {
+ name = "log4j2-export.properties";
+ } else if (color) {
+ name = "log4j2.properties";
+ }
+ InputStream is =
RuntimeUtil.class.getClassLoader().getResourceAsStream(name);
+ String content = IOHelper.loadText(is);
+ IOHelper.close(is);
+
+ StringJoiner sj = new StringJoiner(System.lineSeparator());
+ int i = 0;
+ for (String lc : loggingCategories) {
+ String prefix = "custom" + i++;
+ String catName = StringHelper.before(lc, "=", "").trim();
+ String catLevel = StringHelper.after(lc, "=", "").trim();
+ if (!catName.isEmpty() && !catLevel.isEmpty()) {
+ sj.add("logger." + prefix + ".name=" + catName);
+ sj.add("logger." + prefix + ".level=" + catLevel);
+ sj.add("logger." + prefix + ".appenderRef.$1.ref=out");
+ sj.add("logger." + prefix +
".appenderRef.$2.ref=file");
+ }
+ }
+ content = content + System.lineSeparator() + sj;
+
+ name = CommandLineHelper.CAMEL_JBANG_WORK_DIR +
"/log4j2.properties";
+ Files.writeString(Paths.get(name), content);
+
+ Configurator.initialize("CamelJBang", "file://" +
Path.of(name).toAbsolutePath());
} else {
- Configurator.initialize("CamelJBang",
"log4j2-no-color.properties");
+ // use out of the box logging configuration
+ if (export) {
+ Configurator.initialize("CamelJBang",
"log4j2-export.properties");
+ } else if (script) {
+ Configurator.initialize("CamelJBang",
"log4j2-script.properties");
+ } else if (json) {
+ Configurator.initialize("CamelJBang",
"log4j2-json.properties");
+ } else if (color) {
+ Configurator.initialize("CamelJBang", "log4j2.properties");
+ } else {
+ Configurator.initialize("CamelJBang",
"log4j2-no-color.properties");
+ }
}
}