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

Reply via email to